Compare commits

...

35 Commits

Author SHA1 Message Date
Gavin Andresen
1c15f88653 Only remove database log files on shutdown after wallet encryption/rewrite 2011-11-17 14:21:32 -05:00
Gavin Andresen
37971fcc76 Create new keypool for newly encrypted wallets. 2011-11-17 14:01:25 -05:00
Gavin Andresen
1b93ea0e31 Merge pull request #636 from gavinandresen/master
Fix crash-on-wallet-upgrade bug on OSX
2011-11-15 13:48:12 -08:00
Gavin Andresen
c4de918478 Tweak handling of boost filesystem versions 2011-11-15 14:30:24 -05:00
Gavin Andresen
8d0923109d Fix crash-on-osx-on-shutdown bug. And cleanup CDB handling in Rewrite. 2011-11-15 14:30:24 -05:00
Gavin Andresen
709c1b267f Fix boost filesystem incompatibility problem 2011-11-15 09:47:29 -05:00
Gavin Andresen
b6d11a3018 Merge pull request #635 from gavinandresen/encryptionbug
Prevent unencrypted private keys from being written to wallet.dat
2011-11-15 06:38:43 -08:00
Wladimir J. van der Laan
4585f7e2c1 add message about restarting bitcoin after encrypting wallet succesfully 2011-11-15 09:30:16 -05:00
Gavin Andresen
d764d9161e Obsolete keypool and make sure database removes log files on shutdown. 2011-11-15 09:30:16 -05:00
Pieter Wuille
9e9869d0fe Resilvering 2011-11-14 09:59:22 -05:00
Gavin Andresen
e6a729d2d8 Merge pull request #631 from luke-jr/free_icons
Free icons
2011-11-14 06:57:46 -08:00
Gavin Andresen
88a1b89452 Merge pull request #633 from laanwj/qtrpcconflict
RPC: do not launch Shutdown in a new thread in case we are running the UI
2011-11-14 06:56:57 -08:00
Wladimir J. van der Laan
405ce5a876 Add model null pointer check (solves issue #595 and https://github.com/laanwj/bitcoin-qt/issues/29)
Missed this one before, which can be triggered in race condition if window event arrives before model is set
2011-11-13 08:50:58 +01:00
Wladimir J. van der Laan
19197d5e29 Do not launch Shutdown in a new thread in case we are running the UI.
This leads to the bitcoin core being shut down while the UI is accessing it, and generally results in a segmentation fault or crash. In case it is desirable to make it possible to shutdown the GUI from its RPC server, we'll need to implement a signal for it. For the mean time, this is a safe stopgap.
2011-11-12 14:14:27 +01:00
Luke Dashjr
0fe19a3a2c Replace kfm_home with go-home for "overview" 2011-11-11 11:11:07 -05:00
Luke Dashjr
d2e21a9d74 update doc/assets-attribution.txt 2011-11-10 16:27:24 -05:00
Gavin Andresen
6be6be2ed9 Tool/process for including correct qt translations in mac .App 2011-11-10 13:01:40 -05:00
Luke Dashjr
81dd7aa4c1 Replace icons with Nuvola (LGPL 2.1): some (but not all) GPL-licensed 2011-11-10 12:59:01 -05:00
Luke Dashjr
5a7321562d Replace icons with Nuvola (LGPL 2.1): all non-free except for those by Wladimir van der Laan (who will hopefully relicense) 2011-11-10 12:48:31 -05:00
Gavin Andresen
ba1fce94b5 Merge branch 'nullmodels' of https://github.com/laanwj/bitcoin 2011-11-10 10:30:24 -05:00
Gavin Andresen
5efee7da86 Release process doc fixes 2011-11-10 10:29:24 -05:00
Gavin Andresen
145b2d078e Merge pull request #608 from TheBlueMatt/debian-build
Debian build
2011-11-10 07:27:46 -08:00
Wladimir J. van der Laan
3c0baa68fa Merge pull request #617 from tcatm/translations-readme
add doc/translation_process.md
2011-11-08 23:40:36 -08:00
Wladimir J. van der Laan
90b5aadf56 Merge pull request #611 from sipa/docs
Some extra comments
2011-11-08 23:39:41 -08:00
Wladimir J. van der Laan
dead0ff8cd Add robustness against null models 2011-11-08 21:18:36 +01:00
Wladimir J. van der Laan
0fb0a38339 Merge pull request #618 from laanwj/issue615
Fix segmentation fault when editing address not in address book (issue #615)
2011-11-08 11:01:56 -08:00
Wladimir J. van der Laan
9bc9593df5 Fix segmentation fault when editing address not in address book (issue #615) 2011-11-08 19:54:16 +01:00
Matt Corallo
38f33ce4a3 Add debian build folder 2011-11-08 11:57:05 -05:00
Matt Corallo
2b814d6eb0 Re-add bitcoin(32&80).xpm 2011-11-08 11:43:37 -05:00
Nils Schneider
560078a768 add doc/translation_process.md 2011-11-08 16:19:52 +01:00
Nils Schneider
e1739cbf38 merged translations from transifex: da de es es_CL nb nl ru zh_TW 2011-11-08 14:51:28 +01:00
Pieter Wuille
09d7be3e63 Merge commit 'v0.5.0rc3' 2011-11-08 14:22:18 +01:00
Wladimir J. van der Laan
7e91dd27da Merge pull request #609 from iongchun/add-zhtw
add zh_TW locale
2011-11-07 22:35:00 -08:00
Pieter Wuille
d825e6a31b Some extra comments 2011-11-07 00:11:34 +01:00
Ang Iong Chun
1615c14756 add zh_TW locale 2011-11-06 10:26:11 +08:00
73 changed files with 9066 additions and 3116 deletions

View File

@@ -256,7 +256,7 @@ windows:RC_FILE = src/qt/res/bitcoin-qt.rc
macx:HEADERS += src/qt/macdockiconhandler.h
macx:OBJECTIVE_SOURCES += src/qt/macdockiconhandler.mm
macx:LIBS += -framework Foundation -framework ApplicationServices -framework AppKit
macx:DEFINES += MAC_OSX MSG_NOSIGNAL=0 BOOST_FILESYSTEM_VERSION=3
macx:DEFINES += MAC_OSX MSG_NOSIGNAL=0
macx:ICON = src/qt/res/icons/bitcoin.icns
macx:TARGET = "Bitcoin-Qt"

16
contrib/debian/bin/bitcoin-qt Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/sh
set -e
umask 077
basedir=~/.bitcoin
dbfile="$basedir/DB_CONFIG"
cfgfile="$basedir/bitcoin.conf"
[ -e "$basedir" ] || mkdir "$basedir"
# Bitcoin does not clean up DB log files by default
[ -e "$dbfile" ] || echo 'set_flags DB_LOG_AUTOREMOVE' > "$dbfile"
exec /usr/lib/bitcoin/bitcoin-qt "$@"

18
contrib/debian/bin/bitcoind Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/sh
set -e
umask 077
basedir=~/.bitcoin
dbfile="$basedir/DB_CONFIG"
cfgfile="$basedir/bitcoin.conf"
[ -e "$basedir" ] || mkdir "$basedir"
[ -e "$cfgfile" ] || perl -le 'print"rpcpassword=",map{(a..z,A..Z,0..9)[rand 62]}0..9' > "$cfgfile"
# Bitcoin does not clean up DB log files by default
[ -e "$dbfile" ] || echo 'set_flags DB_LOG_AUTOREMOVE' > "$dbfile"
exec /usr/lib/bitcoin/bitcoind "$@"

View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Encoding=UTF-8
Name=Bitcoin
Comment=Bitcoin P2P Cryptocurrency
Exec=/usr/bin/bitcoin-qt
Terminal=false
Type=Application
Icon=/usr/share/pixmaps/bitcoin80.xpm
#For when bitcoin (finally) properly handles bitcoin: URLs
#MimeType=x-scheme-handler/bitcoin;
Categories=Office;

View File

@@ -0,0 +1,5 @@
debian/bin/bitcoin-qt usr/bin
bitcoin-qt usr/lib/bitcoin
share/pixmaps/bitcoin32.xpm usr/share/pixmaps
share/pixmaps/bitcoin80.xpm usr/share/pixmaps
debian/bitcoin-qt.desktop usr/share/applications

View File

@@ -0,0 +1,2 @@
# Linked code is Expat - only Debian packaging is GPL-2+
bitcoin-qt: possible-gpl-code-linked-with-openssl

View File

@@ -0,0 +1 @@
debian/examples/bitcoin.conf

View File

@@ -0,0 +1,2 @@
debian/bin/bitcoind usr/bin
src/bitcoind usr/lib/bitcoin

View File

@@ -0,0 +1,2 @@
# Linked code is Expat - only Debian packaging is GPL-2+
bitcoind: possible-gpl-code-linked-with-openssl

View File

@@ -0,0 +1,2 @@
debian/manpages/bitcoind.1
debian/manpages/bitcoin.conf.5

248
contrib/debian/changelog Normal file
View File

@@ -0,0 +1,248 @@
bitcoin (0.5.0~rc3-natty0) natty; urgency=low
* New upstream release candidate.
* Don't set rpcpassword for bitcoin-qt.
-- Matt Corallo <matt@bluematt.me> Tue, 8 Nov 2011 11:56:00 -0400
bitcoin (0.5.0~rc1-natty1) natty; urgency=low
* Add test_bitcoin to build test
* Fix clean
* Remove uneccessary build-dependancies
-- Matt Corallo <matt@bluematt.me> Wed, 26 Oct 2011 14:37:18 -0400
bitcoin (0.5.0~rc1-natty0) natty; urgency=low
* Mark for natty
* Fix broken build
* Fix copyright listing
* Remove bitcoin: URL handler until bitcoin actually has support for it (Oops)
-- Matt Corallo <matt@bluematt.me> Wed, 26 Oct 2011 14:37:18 -0400
bitcoin (0.5.0~rc1-2) experimental; urgency=low
* Add bitcoin-qt
-- Matt Corallo <matt@bluematt.me> Tue, 25 Oct 2011 15:24:18 -0400
bitcoin (0.5.0~rc1-1) experimental; urgency=low
* New upstream prerelease.
* Add Github as alternate upstream source in watch file.
* Stop build-depending on libcrypto++-dev, and drop patch 1000:
Upstream no longer use crypto++.
* Drop patch 1003: Upstream builds dynamic by default now.
* Update copyright file: Drop notes on longer included sources.
-- Jonas Smedegaard <dr@jones.dk> Fri, 14 Oct 2011 00:16:18 +0200
bitcoin (0.4.0-1) unstable; urgency=low
* New upstream release.
* Stop repackaging source tarballs: No DFSG-violating stripping left.
* Update copyright file:
+ Add Github URL to Source.
* Drop dpkg-source local-options hint: Declared options are default
since dpkg-source 1.16.1.
+ Add irc URL to Upstream-Contact.
+ Add comment on Bitcoin Developers to catch-all Files section.
+ Add Files sections for newly readded src/cryptopp/* (new custom
BSD-like license), and newly added doc/build-osx.txt and
src/makefile.osx (Expat).
* Bump debhelper compatibility level to 7.
* Suppress binary icns and gpg files.
* Enable regression tests:
+ Build-depend on libboost-test-dev.
+ Extend patch 1003 to also dynamically link test binary.
+ Build and invoke test binary unless tests are disabled.
* Tighten build-dependency on cdbs: Recent version needed to support
debhelper 7.
* Relax build-depend unversioned on debhelper: needed version
satisfied even in oldstable.
* Stop suppress optional build-dependencies: Satisfied in stable.
Build-depend on devscripts (enabling copyright-check).
-- Jonas Smedegaard <dr@jones.dk> Wed, 05 Oct 2011 01:48:53 +0200
bitcoin (0.3.24~dfsg-1) unstable; urgency=low
* New upstream release.
[ Jonas Smedegaard ]
* Improve various usage hints:
+ Explicitly mention in long description that bitcoind contains
daemon and command-line interface.
+ Extend README.Debian with section on lack of GUI, and add primary
headline.
+ Avoid installing upstream README: contains no parts relevant for
Debian usage.
Thanks to richard for suggestions (see bug#629443).
* Favor final releases over prereleases in rules and watch file.
Thanks to Jan Dittberner.
* Track -src (not -linux) tarballs in rules and watch file.
Thanks to Jan Dittberner.
* Drop patches 1004 and 1005 (integrated upstream) and simplify
CXXFLAGS in rules file.
* Stop stripping no longer included source-less binaries from upstream
tarballs.
[ Jan Dittberner ]
* refresh debian/patches/1000_use_system_crypto++.patch
-- Jonas Smedegaard <dr@jones.dk> Tue, 19 Jul 2011 15:08:54 +0200
bitcoin (0.3.21~dfsg-2) unstable; urgency=low
* Enable UPNP support:
+ Drop patch 1006.
+ Build-depend on libminiupnpc-dev.
Thanks to Matt Corallo.
-- Jonas Smedegaard <dr@jones.dk> Sat, 28 May 2011 15:52:44 +0200
bitcoin (0.3.21~dfsg-1) unstable; urgency=low
* New upstream release.
* Refresh patches.
* Drop patch 1002: no longer needed, as upstream use pkgconfig now.
* Add patch 1006 to really unset USE_UPNP as aparently intended.
* Adjust cleanup rule to preserve .gitignore files.
* Update copyright file:
+ Bump format to draft 174 of DEP-5.
+ Shorten comments.
* Bump policy compliance to standards-version 3.9.2.
* Shorten Vcs-Browser paragraph in control file.
* Fix mention daemon (not CLI tools) in short description.
* Stop conflicting with or replace bitcoin-cli: Only transitional, no
longer needed.
* Link against unversioned berkeleydb. Update NEWS and README.Debian
accordingly (and improve wording while at it).
Closes: Bug#621425. Thanks to Ondřej Surý.
* This release also implicitly updates linkage against libcrypto++,
which closes: bug#626953, #627024.
* Disable linkage against not yet Debian packaged MiniUPnP.
* Silence seemingly harmless noise about unused variables.
-- Jonas Smedegaard <dr@jones.dk> Tue, 17 May 2011 15:31:24 +0200
bitcoin (0.3.20.2~dfsg-2) unstable; urgency=medium
* Fix have wrapper script execute real binary (not loop executing
itself).
Closes: bug#617290. Thanks to Philippe Gauthier and Etienne Laurin.
* Set urgency=medium as the only (user-exposed) binary is useless
without this fix and has been for some time.
-- Jonas Smedegaard <dr@jones.dk> Wed, 16 Mar 2011 09:11:06 +0100
bitcoin (0.3.20.2~dfsg-1) unstable; urgency=low
* New upstream release.
* Fix provide and replace former package name bitcoin-cli.
Closes: bug#618439. Thanks to Shane Wegner.
-- Jonas Smedegaard <dr@jones.dk> Tue, 15 Mar 2011 11:41:43 +0100
bitcoin (0.3.20.01~dfsg-1) unstable; urgency=low
* New upstream release.
[ Micah Anderson ]
* Add myself as uploader.
[ Jonas Smedegaard ]
* Add wrapper for bitcoind to ease initial startup.
* Update patches:
+ Drop patch 2002: Applied upstream.
+ Add patch 1005 to add phtread linker option.
Closes: bug#615619. Thanks to Shane Wegner.
+ Refresh patches.
* Extend copyright years in rules file header.
* Rewrite copyright file using draft svn166 of DEP5 format.
* Rename binary package to bitcoind (from bincoin-cli).
Closes: bug#614025. Thanks to Luke-Jr.
-- Jonas Smedegaard <dr@jones.dk> Tue, 01 Mar 2011 15:55:04 +0100
bitcoin (0.3.19~dfsg-6) unstable; urgency=low
* Fix override agressive optimizations.
* Fix tighten build-dependencies to really fit backporting to Lenny:
+ Add fallback build-dependency on libdb4.6++-dev.
+ Tighten unversioned Boost build-dependencies to recent versions,
To force use of versioned Boost when backporting to Lenny.
...needs more love, though: actual build fails.
-- Jonas Smedegaard <dr@jones.dk> Mon, 17 Jan 2011 19:48:35 +0100
bitcoin (0.3.19~dfsg-5) unstable; urgency=low
* Fix lower Boost fallback-build-dependencies to 1.35, really
available in Lenny.
* Correct comment in rules file regarding reason for versioned Boost
fallback-build-dependency.
* Add patch 2002 adding -mt decoration to Boost flags, to ease
backporting to Lenny.
* Respect DEB_BUILD_OPTIONS, and suppress arch-specific optimizations:
+ Add patch 1004 to allow overriding optimization flags.
+ Set optimization flags conditionally at build time.
+ Drop patch 2002 unconditionally suppressing arch-optimizations.
-- Jonas Smedegaard <dr@jones.dk> Mon, 17 Jan 2011 16:04:48 +0100
bitcoin (0.3.19~dfsg-4) unstable; urgency=low
[ Micah Anderson ]
* Provide example bitcoin.conf.
* Add bitcoind(1) and bitcoin.conf(5) man pages.
[ Jonas Smedegaard ]
* Ease backporting:
+ Suppress optional build-dependencies.
+ Add fallback build-dependencies on the most recent Boost libs
available in Lenny (where unversioned Boost libs are missing).
* Add Micah as copyright holder for manpages, licensed as GPL-3+.
* Bump copyright format to Subversion candidate draft 162 of DEP5.
-- Jonas Smedegaard <dr@jones.dk> Mon, 17 Jan 2011 14:00:48 +0100
bitcoin (0.3.19~dfsg-3) unstable; urgency=low
* Document in copyright file files excluded from repackaged source.
* Update copyright file:
+ Bump DEP5 format hint to Subversion draft rev. 153.
+ Consistently wrap at 72 chars.
+ Refer to GPL-2 file (not GPL symlink).
* Link against Berkeley DB 4.8 (not 4.7):
+ Build-depend on libdb4.8++-dev (and on on libdb4.7++-dev).
+ Suggest libdb4.8-util and db4.7-util.
+ Add README.Debian note on (untested) upgrade routine.
+ Add NEWS entry on changed db version, referring to README.Debian.
-- Jonas Smedegaard <dr@jones.dk> Fri, 07 Jan 2011 22:50:57 +0100
bitcoin (0.3.19~dfsg-2) unstable; urgency=low
* Adjust build options to use optimized miner only for amd64. Fixes
FTBFS on i386 (and other archs, if compiling anywhere else at all).
* Avoid static linking.
* Adjust patch 2001 to avoid only arch-specific optimizations (keep
-O3).
* Extend long description to mention disk consumption and initial use
of IRC.
All of above changes thanks to Helmuth Grohne.
* Add lintian override regarding OpenSSL and GPL: Linked code is Expat
- only Debian packaging is GPL-2+.
-- Jonas Smedegaard <dr@jones.dk> Wed, 29 Dec 2010 00:27:54 +0100
bitcoin (0.3.19~dfsg-1) unstable; urgency=low
[ Jonas Smedegaard ]
* Initial release.
Closes: bug#578157.
-- Jonas Smedegaard <dr@jones.dk> Tue, 28 Dec 2010 15:49:22 +0100

1
contrib/debian/compat Normal file
View File

@@ -0,0 +1 @@
7

57
contrib/debian/control Normal file
View File

@@ -0,0 +1,57 @@
Source: bitcoin
Section: utils
Priority: optional
Maintainer: Jonas Smedegaard <dr@jones.dk>
Uploaders: Micah Anderson <micah@debian.org>
Build-Depends: debhelper,
devscripts,
libboost-system-dev (>> 1.35) | libboost-system1.35-dev,
libdb4.8++-dev,
libssl-dev,
pkg-config,
libminiupnpc8-dev,
libboost-filesystem-dev (>> 1.35) | libboost-filesystem1.35-dev,
libboost-program-options-dev (>> 1.35) | libboost-program-options1.35-dev,
libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev,
libboost-test-dev (>> 1.35) | libboost-test1.35-dev,
qt4-qmake,
libqt4-dev
Standards-Version: 3.9.2
Homepage: http://www.bitcoin.org/
Vcs-Git: git://github.com/bitcoin/bitcoin.git
Vcs-Browser: http://github.com/bitcoin/bitcoin
Package: bitcoind
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: peer-to-peer network based anonymous digital currency - daemon
Bitcoin is a free open source peer-to-peer electronic cash system that
is completely decentralized, without the need for a central server or
trusted parties. Users hold the crypto keys to their own money and
transact directly with each other, with the help of a P2P network to
check for double-spending.
.
By default connects to an IRC network to discover other peers.
.
Full transaction history is stored locally at each client. This
requires 150+ MB of space, slowly growing.
.
This package provides bitcoind, a combined daemon and CLI tool to
interact with the daemon.
Package: bitcoin-qt
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: peer-to-peer network based anonymous digital currency - QT GUI
Bitcoin is a free open source peer-to-peer electronic cash system that
is completely decentralized, without the need for a central server or
trusted parties. Users hold the crypto keys to their own money and
transact directly with each other, with the help of a P2P network to
check for double-spending.
.
By default connects to an IRC network to discover other peers.
.
Full transaction history is stored locally at each client. This
requires 150+ MB of space, slowly growing.
.
This package provides bitcoin-qt, a GUI for Bitcoin based on QT.

174
contrib/debian/copyright Normal file
View File

@@ -0,0 +1,174 @@
Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?rev=174
Upstream-Name: Bitcoin
Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com>
irc://#bitcoin@freenode.net
Source: http://sourceforge.net/projects/bitcoin/files/
https://github.com/bitcoin/bitcoin
Files: *
Copyright: 2009-2011, Bitcoin Developers
License: Expat
Comment: The Bitcoin Developers encompasses the current developers listed on bitcoin.org,
as well as the numerous contributors to the project.
Files: src/json/*
Copyright: 2007-2009, John W. Wilkinson
License: Expat
Files: src/strlcpy.h
Copyright: 1998, Todd C. Miller <Todd.Miller@courtesan.com>
License: ISC
Files: debian/*
Copyright: 2010-2011, Jonas Smedegaard <dr@jones.dk>
2011, Matt Corallo <matt@bluematt.me>
License: GPL-2+
Files: debian/manpages/*
Copyright: Micah Anderson <micah@debian.org>
License: GPL-3+
Files: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png,
src/qt/res/src/*.svg
Copyright: Wladimir van der Laan
License: CC-BY-3
Files: src/qt/res/icons/address-book.png, src/qt/res/icons/export.png,
src/qt/res/icons/history.png, src/qt/res/icons/key.png,
src/qt/res/icons/lock_*.png, src/qt/res/icons/overview.png,
src/qt/res/icons/receive.png, src/qt/res/icons/send.png,
src/qt/res/icons/synced.png
Copyright: David Vignoni (david@icon-king.com)
ICON KING - www.icon-king.com
License: LGPL
Comment: NUVOLA ICON THEME for KDE 3.x
Original icons: kaddressbook, klipper_dock, view-list-text,
key-password, encrypted/decrypted, go-home, go-down,
go-next, dialog-ok
Site: http://www.icon-king.com/projects/nuvola/
Files: src/qt/res/icons/connect*.png
Copyright: schollidesign
License: GPL-3+
Comment: Icon Pack: Human-O2
Site: http://findicons.com/icon/93743/blocks_gnome_netstatus_0
Files: src/qt/res/icons/transaction*.png
Copyright: md2k7
License: You are free to do with these icons as you wish, including selling,
copying, modifying etc.
Comment: Site: https://forum.bitcoin.org/index.php?topic=15276.0
Files: src/qt/res/icons/configure.png, src/qt/res/icons/quit.png,
src/qt/res/icons/editcopy.png, src/qt/res/icons/editpaste.png,
src/qt/res/icons/add.png, src/qt/res/icons/edit.png,
src/qt/res/icons/remove.png
Copyright: http://www.everaldo.com
License: LGPL
Comment: Icon Pack: Crystal SVG
Files: src/qt/res/icons/bitcoin.png, src/qt/res/icons/toolbar.png
Copyright: Bitboy (optimized for 16x16 by Wladimir van der Laan)
License: PUB-DOM
Comment: Site: http://forum.bitcoin.org/?topic=1756.0
Files: scripts/img/reload.xcf, src/qt/res/movies/update_spinner.mng
Copyright: Everaldo (Everaldo Coelho)
License: GPL-3+
Comment: Icon Pack: Kids
Site: http://findicons.com/icon/17102/reload?id=17102
Files: src/qt/res/images/splash2.jpg
License: PUB-DOM
Copyright: Crobbo (forum)
Comment: Site: https://bitcointalk.org/index.php?topic=32273.0
License: Expat
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.
License: ISC
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
License: GPL-2+
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
Comment:
On Debian systems the GNU General Public License (GPL) version 2 is
located in '/usr/share/common-licenses/GPL-2'.
.
You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
License: GPL-3+
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU General Public License, Version 3 or any
later version published by the Free Software Foundation.
Comment:
On Debian systems the GNU General Public License (GPL) version 3 is
located in '/usr/share/common-licenses/GPL-3'.
.
You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
License: CC-BY-3
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
Comment:
You can get a full copy of the license at
<http://creativecommons.org/licenses/by/3.0/>.
License: LGPL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Comment:
On Debian systems the GNU Lesser General Public License (LGPL) is
located in '/usr/share/common-licenses/LGPL'.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
License: PUB-DOM
This work is in the public domain.

View File

@@ -0,0 +1,88 @@
# bitcoin.conf configuration file. Lines beginning with # are comments.
# Network-related settings:
# Run on the test network instead of the real bitcoin network.
#testnet=1
# Connect via a socks4 proxy
#proxy=127.0.0.1:9050
# Use as many addnode= settings as you like to connect to specific peers
#addnode=69.164.218.197
#addnode=10.0.0.2:8333
# ... or use as many connect= settings as you like to connect ONLY
# to specific peers:
#connect=69.164.218.197
#connect=10.0.0.1:8333
# Do not use Internet Relay Chat (irc.lfnet.org #bitcoin channel) to
# find other peers.
#noirc=1
# Maximum number of inbound+outbound connections.
#maxconnections=
# JSON-RPC options (for controlling a running Bitcoin/bitcoind process)
# server=1 tells Bitcoin to accept JSON-RPC commands.
#server=1
# You must set rpcuser and rpcpassword to secure the JSON-RPC api
#rpcuser=Ulysseys
#rpcpassword=YourSuperGreatPasswordNumber_385593
# By default, only RPC connections from localhost are allowed. Specify
# as many rpcallowip= settings as you like to allow connections from
# other hosts (and you may use * as a wildcard character):
#rpcallowip=10.1.1.34
#rpcallowip=192.168.1.*
# Listen for RPC connections on this TCP port:
rpcport=8332
# You can use Bitcoin or bitcoind to send commands to Bitcoin/bitcoind
# running on another host using this option:
rpcconnect=127.0.0.1
# Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate
# with Bitcoin -server or bitcoind
#rpcssl=1
# OpenSSL settings used when rpcssl=1
rpcsslciphers=TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH
rpcsslcertificatechainfile=server.cert
rpcsslprivatekeyfile=server.pem
# Miscellaneous options
# Set gen=1 to attempt to generate bitcoins
gen=0
# Use SSE instructions to try to generate bitcoins faster.
#4way=1
# Pre-generate this many public/private key pairs, so wallet backups will be valid for
# both prior transactions and several dozen future transactions.
keypool=100
# Pay an optional transaction fee every time you send bitcoins. Transactions with fees
# are more likely than free transactions to be included in generated blocks, so may
# be validated sooner.
paytxfee=0.00
# Allow direct connections for the 'pay via IP address' feature.
#allowreceivebyip=1
# User interface options
# Start Bitcoin minimized
#min=1
# Minimize to the system tray
#minimizetotray=1

5
contrib/debian/gbp.conf Normal file
View File

@@ -0,0 +1,5 @@
# Configuration file for git-buildpackage and friends
[DEFAULT]
pristine-tar = True
sign-tags = True

View File

@@ -0,0 +1,94 @@
.TH BITCOIN.CONF "5" "January 2011" "bitcoin.conf 3.19"
.SH NAME
bitcoin.conf \- bitcoin configuration file
.SH SYNOPSIS
All command-line options (except for '-datadir' and '-conf') may be specified in a configuration file, and all configuration file options may also be specified on the command line. Command-line options override values set in the configuration file.
.TP
The configuration file is a list of 'setting=value' pairs, one per line, with optional comments starting with the '#' character.
.TP
The configuration file is not automatically created; you can create it using your favorite plain-text editor. By default, bitcoind(1) will look for a file named bitcoin.conf(5) in the bitcoin data directory, but both the data directory and the configuration file path may be changed using the '-datadir' and '-conf' command-line arguments.
.SH LOCATION
bitcoin.conf should be located in $HOME/.bitcoin
.SH NETWORK-RELATED SETTINGS
.TP
.TP
\fBtestnet=\fR[\fI'1'\fR|\fI'0'\fR]
Enable or disable run on the test network instead of the real *bitcoin* network.
.TP
\fBproxy=\fR\fI'127.0.0.1:9050'\fR
Connect via a socks4 proxy.
.TP
\fBaddnode=\fR\fI'10.0.0.2:8333'\fR
Use as many *addnode=* settings as you like to connect to specific peers.
.TP
\fBconnect=\fR\fI'10.0.0.1:8333'\fR
Use as many *connect=* settings as you like to connect ONLY to specific peers.
.TP
\fBnoirc=\fR[\fI'1'\fR|\fI'0'\fR]
Use or Do not use Internet Relay Chat (irc.lfnet.org #bitcoin channel) to find other peers.
.TP
\fRmaxconnections=\fR\fI'value'\fR
Maximum number of inbound+outbound connections.
.SH JSON-RPC OPTIONS
.TP
\fBserver=\fR[\fI'1'\fR|\fI'0'\fR]
Tells *bitcoin* to accept or not accept JSON-RPC commands.
.TP
\fBrpcuser=\fR\fI'username'\fR
You must set *rpcuser* to secure the JSON-RPC api.
.TP
\fBrpcpassword=\fR\fI'password'\fR
You must set *rpcpassword* to secure the JSON-RPC api.
.TP
\fBrpctimeout=\fR\fI'30'\fR
How many seconds *bitcoin* will wait for a complete RPC HTTP request, after the HTTP connection is established.
.TP
\fBrpcallowip=\fR\fI'192.168.1.*'\fR
By default, only RPC connections from localhost are allowed. Specify as many *rpcallowip=* settings as you like to allow connections from other hosts (and you may use * as a wildcard character).
.TP
\fBrpcport=\fR\fI'8332'\fR
Listen for RPC connections on this TCP port.
.TP
\fBrpcconnect=\fR\fI'127.0.0.1'\fR
You can use *bitcoin* or *bitcoind(1)* to send commands to *bitcoin*/*bitcoind(1)* running on another host using this option.
.TP
\fBrpcssl=\fR\fI'1'\fR
Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate with *bitcoin* '-server' or *bitcoind(1)*. Example of OpenSSL settings used when *rpcssl*='1':
.TP
\fBrpcsslciphers=\fR\fI'TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH'\fR
.TP
\fBrpcsslcertificatechainfile=\fR\fI'server.cert'\fR
.TP
\fBrpcsslprivatekeyfile=\fR\fI'server.pem'\fR
.TP
.SH MISCELLANEOUS OPTIONS
.TP
\fBgen=\fR[\fI'0'\fR|\fI'1'\fR]
Enable or disable attempt to generate bitcoins.
.TP
\fB4way=\fR[\fI'0'\fR|\fI'1'\fR]
Enable or disable use SSE instructions to try to generate bitcoins faster.
.TP
\fBkeypool=\fR\fI'100'\fR
Pre-generate this many public/private key pairs, so wallet backups will be valid for both prior transactions and several dozen future transactions.
.TP
\fBpaytxfee=\fR\fI'0.00'\fR
Pay an optional transaction fee every time you send bitcoins. Transactions with fees are more likely than free transactions to be included in generated blocks, so may be validated sooner.
.TP
\fBallowreceivebyip=\fR\fI'1'\fR
Allow direct connections for the 'pay via IP address' feature.
.TP
.SH USER INTERFACE OPTIONS
.TP
\fBmin=\fR[\fI'0'\fR|\fI'1'\fR]
Enable or disable start bitcoind minimized.
.TP
\fBminimizetotray=\fR[\fI'0'\fR|\fI'1'\fR]
Enable or disable minimize to the system tray.
.SH "SEE ALSO"
bitcoind(1)
.SH AUTHOR
This manual page was written by Micah Anderson <micah@debian.org> for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation.
On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL.

View File

@@ -0,0 +1,209 @@
.TH BITCOIND "1" "January 2011" "bitcoind 3.19"
.SH NAME
bitcoind \- peer-to-peer network based anonymous digital currency
.SH SYNOPSIS
bitcoin [options] <command> [params]
.TP
bitcoin [options] help <command> - Get help for a command
.SH DESCRIPTION
This manual page documents the bitcoind program. Bitcoin is a peer-to-peer digital currency. Peer-to-peer (P2P) means that there is no central authority to issue new money or keep track of transactions. Instead, these tasks are managed collectively by the nodes of the network. Advantages:
Bitcoins can be sent easily through the Internet, without having to trust middlemen. Transactions are designed to be irreversible. Be safe from instability caused by fractional reserve banking and central banks. The limited inflation of the Bitcoin systems money supply is distributed evenly (by CPU power) throughout the network, not monopolized by banks.
.SH OPTIONS
.TP
\fB\-conf=\fR<file>
Specify configuration file (default: bitcoin.conf)
.TP
\fB\-gen\fR
Generate coins
.TP
\fB\-gen\fR=\fI0\fR
Don't generate coins
.TP
\fB\-min\fR
Start minimized
.TP
\fB\-datadir=\fR<dir>
Specify data directory
.TP
\fB\-proxy=\fR<ip:port>
Connect through socks4 proxy
.TP
\fB\-addnode=\fR<ip>
Add a node to connect to
.TP
\fB\-connect=\fR<ip>
Connect only to the specified node
.TP
\fB\-paytxfee=\fR<amt>
Fee per KB to add to transactions you send
.TP
\fB\-server\fR
Accept command line and JSON\-RPC commands
.TP
\fB\-daemon\fR
Run in the background as a daemon and accept commands
.TP
\fB\-testnet\fR
Use the test network
.TP
\fB\-rpcuser=\fR<user>
Username for JSON\-RPC connections
.TP
\fB\-rpcpassword=\fR<pw>
Password for JSON\-RPC connections
.TP
\fB\-rpcport=\fR<port>
Listen for JSON\-RPC connections on <port>
.TP
\fB\-rpcallowip=\fR<ip>
Allow JSON\-RPC connections from specified IP address
.TP
\fB\-rpcconnect=\fR<ip>
Send commands to node running on <ip>
.PP
SSL options: (see the Bitcoin Wiki for SSL setup instructions)
.TP
\fB\-rpcssl\fR=\fI1\fR
Use OpenSSL (https) for JSON\-RPC connections
.TP
\fB\-rpcsslcertificatchainfile=\fR<file.cert>
Server certificate file (default: server.cert)
.TP
\fB\-rpcsslprivatekeyfile=\fR<file.pem>
Server private key (default: server.pem)
.TP
\fB\-rpcsslciphers=\fR<ciphers>
Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
.TP
\-?
This help message
.SH COMMANDS
.TP
\fBbackupwallet 'destination'\fR
Safely copies *wallet.dat* to 'destination', which can be a directory or a path with filename.
.TP
\fBgetaccount 'bitcoinaddress'\fR
Returns the account associated with the given address.
.TP
\fBsetaccount 'bitcoinaddress' ['account']\fR
Sets the ['account'] associated with the given address. ['account'] may be omitted to remove an address from ['account'].
.TP
\fBgetaccountaddress 'account'\fR
Returns a new bitcoin address for 'account'.
.TP
\fBgetaddressesbyaccount 'account'\fR
Returns the list of addresses associated with the given 'account'.
.TP
\fBgetbalance 'account'\fR
Returns the server's available balance, or the balance for 'account'.
.TP
\fBgetblockcount\fR
Returns the number of blocks in the longest block chain.
.TP
\fBgetblocknumber\fR
Returns the block number of the latest block in the longest block chain.
.TP
\fBgetconnectioncount\fR
Returns the number of connections to other nodes.
.TP
\fBgetdifficulty\fR
Returns the proof-of-work difficulty as a multiple of the minimum difficulty.
.TP
\fBgetgenerate\fR
Returns boolean true if server is trying to generate bitcoins, false otherwise.
.TP
\fBsetgenerate 'generate' ['genproclimit']\fR
Generation is limited to ['genproclimit'] processors, -1 is unlimited.
.TP
\fBgethashespersec\fR
Returns a recent hashes per second performance measurement while generating.
.TP
\fBgetinfo\fR
Returns an object containing server information.
.TP
\fBgetnewaddress 'account'\fR
Returns a new bitcoin address for receiving payments. If 'account' is specified (recommended), it is added to the address book so payments received with the address will be credited to 'account'.
.TP
\fBgetreceivedbyaccount 'account' ['minconf=1']\fR
Returns the total amount received by addresses associated with 'account' in transactions with at least ['minconf'] confirmations.
.TP
\fBgetreceivedbyaddress 'bitcoinaddress' ['minconf=1']\fR
Returns the total amount received by 'bitcoinaddress' in transactions with at least ['minconf'] confirmations.
.TP
\fBgettransaction 'txid'\fR
Returns information about a specific transaction, given hexadecimal transaction ID.
.TP
\fBgetwork 'data'\fR
If 'data' is specified, tries to solve the block and returns true if it was successful. If 'data' is not specified, returns formatted hash 'data' to work on:
"midstate" : precomputed hash state after hashing the first half of the data.
"data" : block data.
"hash1" : formatted hash buffer for second hash.
"target" : little endian hash target.
.TP
\fBhelp 'command'\fR
List commands, or get help for a command.
.TP
\fBlistaccounts ['minconf=1']\fR
List accounts and their current balances.
*note: requires bitcoin 0.3.20 or later.
.TP
\fBlistreceivedbyaccount ['minconf=1'] ['includeempty=false']\fR
['minconf'] is the minimum number of confirmations before payments are included. ['includeempty'] whether to include addresses that haven't received any payments. Returns an array of objects containing:
"account" : the account of the receiving address.
"amount" : total amount received by the address.
"confirmations" : number of confirmations of the most recent transaction included.
.TP
\fBlistreceivedbyaddress ['minconf=1'] ['includeempty=false']\fR
['minconf'] is the minimum number of confirmations before payments are included. ['includeempty'] whether to include addresses that haven't received any payments. Returns an array of objects containing:
"address" : receiving address.
"account" : the account of the receiving address.
"amount" : total amount received by the address.
"confirmations" : number of confirmations of the most recent transaction included.
.TP
\fBlisttransactions 'account' ['count=10']\fR
Returns a list of the last ['count'] transactions for 'account' - for all accounts if 'account' is not specified or is "*". Each entry in the list may contain:
"category" : will be generate, send, receive, or move.
"amount" : amount of transaction.
"fee" : Fee (if any) paid (only for send transactions).
"confirmations" : number of confirmations (only for generate/send/receive).
"txid" : transaction ID (only for generate/send/receive).
"otheraccount" : account funds were moved to or from (only for move).
"message" : message associated with transaction (only for send).
"to" : message-to associated with transaction (only for send).
*note: requires bitcoin 0.3.20 or later.
.TP
\fBmove <'fromaccount'> <'toaccount'> <'amount'> ['minconf=1'] ['comment']\fR
Moves funds between accounts.
.TP
\fBsendfrom* <'account'> <'bitcoinaddress'> <'amount'> ['minconf=1'] ['comment'] ['comment-to']\fR
Sends amount from account's balance to 'bitcoinaddress'. This method will fail if there is less than amount bitcoins with ['minconf'] confirmations in the account's balance (unless account is the empty-string-named default account; it behaves like the *sendtoaddress* method). Returns transaction ID on success.
.TP
\fBsendtoaddress 'bitcoinaddress' 'amount' ['comment'] ['comment-to']\fR
Sends amount from the server's available balance to 'bitcoinaddress'. amount is a real and is rounded to the nearest 0.01. Returns transaction id on success.
.TP
\fBstop\fR
Stops the bitcoin server.
.TP
\fBvalidateaddress 'bitcoinaddress'\fR
Checks that 'bitcoinaddress' looks like a proper bitcoin address. Returns an object containing:
"isvalid" : true or false.
"ismine" : true if the address is in the server's wallet.
"address" : bitcoinaddress.
*note: ismine and address are only returned if the address is valid.
.SH "SEE ALSO"
bitcoin.conf(5)
.SH AUTHOR
This manual page was written by Micah Anderson <micah@debian.org> for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation.
On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL.

View File

@@ -0,0 +1,26 @@
Description: Use system JSON Spirit library
Author: Jonas Smedegaard <dr@jones.dk>
Last-Update: 2011-05-17
--- a/src/rpc.cpp
+++ b/src/rpc.cpp
@@ -12,9 +12,7 @@
#include <boost/asio/ssl.hpp>
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SSLStream;
#endif
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_writer_template.h"
-#include "json/json_spirit_utils.h"
+#include <json_spirit.h>
#define printf OutputDebugStringF
// MinGW 3.4.5 gets "fatal error: had to relocate PCH" if the json headers are
// precompiled in headers.h. The problem might be when the pch file goes over
--- a/src/makefile.unix
+++ b/src/makefile.unix
@@ -23,6 +23,7 @@
-l boost_thread \
-l db_cxx \
-l ssl \
+ -l json_spirit \
-l crypto
ifdef USE_UPNP

View File

@@ -0,0 +1,3 @@
0xxx: Grabbed from upstream development.
1xxx: Possibly relevant for upstream adoption.
2xxx: Only relevant for official Debian release.

View File

@@ -0,0 +1 @@
#1001_use_system_json-spirit.patch

33
contrib/debian/rules Executable file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/make -f
# -*- mode: makefile; coding: utf-8 -*-
#DEB_MAKE_CHECK_TARGET = test_bitcoin
#build/bitcoind::
# $(if $(filter nocheck,$(DEB_BUILD_OPTIONS)),,src/test_bitcoin)
DEB_INSTALL_EXAMPLES_bitcoind += debian/examples/*
DEB_INSTALL_MANPAGES_bitcoind += debian/manpages/*
%:
dh $@
override_dh_auto_build:
cd src; $(MAKE) -f makefile.unix bitcoind
$(MAKE)
override_dh_auto_clean:
if [ -f Makefile ]; then $(MAKE) clean; else rm -rf build/; rm -f bitcoin-qt; fi
cd src; $(MAKE) -f makefile.unix clean
override_dh_auto_configure:
qmake bitcoin-qt.pro
override_dh_auto_test:
cd src; $(MAKE) -f makefile.unix test_bitcoin
src/test_bitcoin
# Ensure wrapper is set executable
binary-post-install/bitcoind:
chmod +x $(cdbs_curdestdir)usr/bin/bitcoind
binary-post-install/bitcoin-qt:
chmod +x $(cdbs_curdestdir)usr/bin/bitcoin-qt

View File

@@ -0,0 +1 @@
3.0 (quilt)

7
contrib/debian/watch Normal file
View File

@@ -0,0 +1,7 @@
# Run the "uscan" command to check for upstream updates and more.
version=3
# use qa.debian.org redirector; see man uscan
opts=uversionmangle=s/(\d)(alpha|beta|rc)/$1~$2/;s/\-src//,dversionmangle=s/~dfsg\d*// \
http://sf.net/bitcoin/bitcoin-(\d.*)-linux\.tar\.gz debian
opts=uversionmangle=s/(\d)(alpha|beta|rc)/$1~$2/,dversionmangle=s/~dfsg\d*// \
http://githubredir.debian.net/github/bitcoin/bitcoin v(.*).tar.gz

22
contrib/qt_translations.py Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env python
# Helpful little script that spits out a comma-separated list of
# language codes for Qt icons that should be included
# in binary bitcoin distributions
import glob
import os
import re
import sys
if len(sys.argv) != 3:
sys.exit("Usage: %s $QTDIR/translations $BITCOINDIR/src/qt/locale"%sys.argv[0])
d1 = sys.argv[1]
d2 = sys.argv[2]
l1 = set([ re.search(r'qt_(.*).qm', f).group(1) for f in glob.glob(os.path.join(d1, 'qt_*.qm')) ])
l2 = set([ re.search(r'bitcoin_(.*).qm', f).group(1) for f in glob.glob(os.path.join(d2, 'bitcoin_*.qm')) ])
print ",".join(sorted(l1.intersection(l2)))

View File

@@ -3,19 +3,18 @@ Icon: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png,
Designer: Wladimir van der Laan
License: Creative Commons Attribution
Icon: src/qt/res/icons/send.png
Icon Pack: Vista Style Arrow
Designer: Icons Land
License: Freeware Non-commercial
Site: http://findicons.com/icon/231371/right3green
Icon: src/qt/res/icons/address-book.png, src/qt/res/icons/export.png,
src/qt/res/icons/history.png, src/qt/res/icons/key.png,
src/qt/res/icons/lock_*.png, src/qt/res/icons/overview.png,
src/qt/res/icons/receive.png, src/qt/res/icons/send.png,
src/qt/res/icons/synced.png
Icon Pack: NUVOLA ICON THEME for KDE 3.x
Designer: David Vignoni (david@icon-king.com)
ICON KING - www.icon-king.com
License: LGPL
Site: http://www.icon-king.com/projects/nuvola/
Icon: src/qt/res/icons/address-book.png
Icon Pack: Farm-Fresh Web
Designer: FatCow Web Hosting
License: Creative Commons Attribution (by)
Site: http://findicons.com/icon/163938/book_open
Icon: src/qt/res/icons/connect*.png, src/qt/res/icons/synced.png, src/qt/res/icons/lock_*.png
Icon: src/qt/res/icons/connect*.png
Icon Pack: Human-O2
Designer: schollidesign
License: GNU/GPL
@@ -35,24 +34,11 @@ Designer: http://www.everaldo.com
Icon Pack: Crystal SVG
License: LGPL
Icon: src/qt/res/icons/receive.png, src/qt/res/icons/history.png,
src/qt/res/icons/export.png
Designer: Oxygen team
Icon Pack: Oxygen
License: Creative Common Attribution-ShareAlike 3.0 License or LGPL
Site: http://www.oxygen-icons.org/
Icon: src/qt/res/icons/bitcoin.png, src/qt/res/icons/toolbar.png
Designer: Bitboy (optimized for 16x16 by Wladimir van der Laan)
License: Public Domain
Site: http://forum.bitcoin.org/?topic=1756.0
Icon: src/qt/res/icons/overview.png
Icon Pack: Primo
Designer: Jack Cai
License: Creative Commons Attribution No Derivatives (by-nd)
Site: http://findicons.com/icon/175944/home?id=176221#
Icon: scripts/img/reload.xcf (modified),src/qt/res/movies/update_spinner.mng
Icon Pack: Kids
Designer: Everaldo (Everaldo Coelho)
@@ -64,10 +50,3 @@ Designer: Crobbo (forum)
Site: https://bitcointalk.org/index.php?topic=32273.0
License: Public domain
Icon: src/qt/res/icons/key.png
Designer: VisualPharm (Ivan Boyko)
Icon Pack: Must Have
Site: http://findicons.com/icon/51009/key?id=51009
License: Creative Commons Attribution (by)

View File

@@ -44,14 +44,16 @@
* Build bitcoind and bitcoin-qt on Linux32, Linux64, and Win32:
./bin/gbuild --commit bitcoin=v$VERSION ../bitcoin/contrib/gitian-descriptors/gitian.yml
./bin/gsign --signer $SIGNER --release $VERSION --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian.yml
cd build/out
zip bitcoin-$VERSION-linux-gitian.zip *
pushd build/out
zip -r bitcoin-$VERSION-linux-gitian.zip *
mv bitcoin-$VERSION-linux-gitian.zip ../../
popd
./bin/gbuild --commit bitcoin=v$VERSION ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml
./bin/gsign --signer $SIGNER --release $VERSION-win32 --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml
cd build/out
zip bitcoin-$VERSION-win32-gitian.zip *
pushd build/out
zip -r bitcoin-$VERSION-win32-gitian.zip *
mv bitcoin-$VERSION-win32-gitian.zip ../../
popd
Build output expected:
1. linux 32-bit and 64-bit binaries + source (bitcoin-$VERSION-linux-gitian.zip)
@@ -61,18 +63,15 @@
* repackage gitian builds for release as stand-alone zip/tar/installer exe
* Linux .tar.gz:
mkdir bitcoin-$VERSION-linux
cd bitcoin-$VERSION-linux
unzip bitcoin-$VERSION-linux-gitian.zip
cd ..; tar czvf bitcoin-$VERSION-linux.tar.gz bitcoin-$VERSION-linux
unzip bitcoin-$VERSION-linux-gitian.zip -d bitcoin-$VERSION-linux
tar czvf bitcoin-$VERSION-linux.tar.gz bitcoin-$VERSION-linux
rm -rf bitcoin-$VERSION-linux
* Windows .zip and setup.exe:
mkdir bitcoin-$VERSION-win32
cd bitcoin-$VERSION-win32
unzip bitcoin-$VERSION-win32-gitian.zip
mv bitcoin-$VERSION-win32-setup.exe ..
cd ..; zip bitcoin-$VERSION-win32.zip bitcoin-$VERSION-win32
unzip bitcoin-$VERSION-win32-gitian.zip -d bitcoin-$VERSION-win32
mv bitcoin-$VERSION-win32/bitcoin-*-setup.exe .
zip -r bitcoin-$VERSION-win32.zip bitcoin-$VERSION-win32
rm -rf bitcoin-$VERSION-win32
* perform Mac build
See this blog post for how Gavin set up his build environment and
@@ -81,7 +80,8 @@
qmake USE_SSL=1 USE_UPNP=1 bitcoin-qt.pro
make
export QTDIR=/opt/local/share/qt4 # needed to find translations/qt_*.qm files
contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr de,es,ru -dmg -fancy contrib/macdeploy/fancy.plist
T=$(contrib/qt_translations.py $QTDIR/translations src/qt/locale)
contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist
Build output expected:
Bitcoin-Qt.dmg
@@ -112,7 +112,7 @@
cp ../gitian.sigs/$VERSION/$file/bitcoin-build.assert ./gitian/$file-build.assert
cp ../gitian.sigs/$VERSION/$file/bitcoin-build.assert.sig ./gitian/$file-build.assert.sig
done
zip bitcoin-$VERSION-linux-gitian.zip *
zip -r bitcoin-$VERSION-linux-gitian.zip *
cp bitcoin-$VERSION-linux-gitian.zip ../
cd ..
mkdir bitcoin-$VERSION-linux-gitian; cd bitcoin-$VERSION-linux-gitian
@@ -123,9 +123,7 @@
cp ../gitian.sigs/$VERSION/$file/bitcoin-build.assert ./gitian/$file-build.assert
cp ../gitian.sigs/$VERSION/$file/bitcoin-build.assert.sig ./gitian/$file-build.assert.sig
done
zip bitcoin-$VERSION-linux-gitian.zip *
zip -r bitcoin-$VERSION-linux-gitian.zip *
cp bitcoin-$VERSION-linux-gitian.zip ../
* Upload gitian zips to SourceForge

View File

@@ -0,0 +1,63 @@
Translations
============
The QT GUI can be easily be translated into other languages. Here's how we
handle those translations.
Files and Folders
-----------------
### bitcoin-qt.pro
This file takes care of generating `.qm` files from `.ts` files. It is mostly
automated.
### src/qt/bitcoin.qrc
This file must be updated whenever a new translation is added. Please note that
files must end with `.qm`, not `.ts`.
<qresource prefix="/translations">
<file alias="en">locale/bitcoin_en.qm</file>
...
</qresource>
### src/qt/locale/
This directory contains all translations. Filenames must adhere to this format:
bitcoin_xx_YY.ts or bitcoin_xx.ts
#### Source file
`src/qt/locale/bitcoin_en.ts` is a treated in a special way. It is used as the
source for all other translations. Whenever a string in the code is change
this file must be updated to reflect those changes. Usually, this can be
accomplished by running `lupdate`
Syncing with transifex
----------------------
We are using http://transifex.net as a frontend for translating the client.
https://www.transifex.net/projects/p/bitcoin/resource/tx/
The "transifex client":http://help.transifex.net/features/client/index.html
will help with fetching new translations from transifex.
### .tx/config
[main]
host = https://www.transifex.net
[bitcoin.tx]
file_filter = src/qt/locale/bitcoin_<lang>.ts
source_file = src/qt/locale/bitcoin_en.ts
source_lang = en
### Fetching new translations
1. `tx pull -a`
2. update `src/qt/bitcoin.qrc`
3. `git add` new translations from `src/qt/locale/`

232
share/pixmaps/bitcoin32.xpm Normal file
View File

@@ -0,0 +1,232 @@
/* XPM */
static const char * bitcoin32_xpm[] = {
/* columns rows colors chars-per-pixel */
"32 32 194 2",
" c #745305",
". c #785704",
"X c #7C5903",
"o c #75560B",
"O c #77590F",
"+ c #7C5C0B",
"@ c #795B12",
"# c #7F631D",
"$ c #825E07",
"% c #825F0B",
"& c #85610A",
"* c #8C660C",
"= c #8E680E",
"- c #916B0F",
"; c #856515",
": c #8B6714",
"> c #8F6A16",
", c #816218",
"< c #88691C",
"1 c #926D12",
"2 c #936F1C",
"3 c #997417",
"4 c #94721E",
"5 c #9B761C",
"6 c #9F781C",
"7 c #A17B1E",
"8 c #826622",
"9 c #916E20",
"0 c #967425",
"q c #9D7420",
"w c #9C7923",
"e c #997728",
"r c #99792C",
"t c #A37D23",
"y c #A37F2C",
"u c #A68125",
"i c #AB8225",
"p c #A5832B",
"a c #AA852C",
"s c #B28A2C",
"d c #A58233",
"f c #AC8734",
"g c #AE8C33",
"h c #AC8C3C",
"j c #B28C33",
"k c #B98E34",
"l c #B28D3D",
"z c #B59136",
"x c #BC9335",
"c c #B3913E",
"v c #BC933A",
"b c #BF9A3D",
"n c #C19235",
"m c #C2953C",
"M c #C39B3C",
"N c #CA9C3D",
"B c #B59343",
"V c #BE9642",
"C c #B69A44",
"Z c #BD9A45",
"A c #B49649",
"S c #BB9A49",
"D c #BB9F52",
"F c #BFA256",
"G c #C49C43",
"H c #CA9D41",
"J c #C59D4A",
"K c #C99E4D",
"L c #C3A144",
"P c #CDA244",
"I c #CFAA47",
"U c #C3A14D",
"Y c #CDA24A",
"T c #CCAB49",
"R c #D2A644",
"E c #D2A54B",
"W c #D6AA4C",
"Q c #DAAE4E",
"! c #DAB04F",
"~ c #C7A656",
"^ c #CDA452",
"/ c #CFAC52",
"( c #C0A65E",
") c #CEA75A",
"_ c #CCAC59",
"` c #D2AB53",
"' c #DCAF52",
"] c #D6AD5A",
"[ c #D9AE5B",
"{ c #DCB556",
"} c #DFB855",
"| c #D6B25F",
" . c #DCB35C",
".. c #DEBE5E",
"X. c #E2B656",
"o. c #E1B55A",
"O. c #E6BC5D",
"+. c #E9BD5E",
"@. c #C3AA63",
"#. c #CCAD62",
"$. c #D4AF62",
"%. c #CDB565",
"&. c #CEB46D",
"*. c #D7B164",
"=. c #DBB362",
"-. c #D6BD64",
";. c #DDBA64",
":. c #D3B66C",
">. c #DFB86B",
",. c #CEB772",
"<. c #D0B771",
"1. c #D4BA73",
"2. c #D9BE77",
"3. c #D6BE79",
"4. c #D8BF7A",
"5. c #E4BB62",
"6. c #E9BF64",
"7. c #E4BC69",
"8. c #E9BF69",
"9. c #E0BB71",
"0. c #E9C05E",
"q. c #D2C279",
"w. c #DBC27C",
"e. c #E2C667",
"r. c #EDC364",
"t. c #E3C16E",
"y. c #ECC46C",
"u. c #EDCC6C",
"i. c #F1C764",
"p. c #F5CA66",
"a. c #F9CD67",
"s. c #F5CC6A",
"d. c #F9CD6B",
"f. c #FBD36F",
"g. c #EDC572",
"h. c #E5CF77",
"j. c #ECCA74",
"k. c #E0C67E",
"l. c #EFCE78",
"z. c #F6CE72",
"x. c #FBCF71",
"c. c #F4CE79",
"v. c #F4D273",
"b. c #FCD473",
"n. c #F4DC75",
"m. c #FEDA74",
"M. c #F6D77C",
"N. c #FBD47A",
"B. c #F1DA7B",
"V. c #FDDA7C",
"C. c #FEE27D",
"Z. c #DDC683",
"A. c #DFC884",
"S. c #E4CA84",
"D. c #E3CC89",
"F. c #E7D183",
"G. c #EFD280",
"H. c #EFDC82",
"J. c #ECD48D",
"K. c #EFDA8C",
"L. c #F9D783",
"P. c #F2DF83",
"I. c #FCDB83",
"U. c #F5DC8F",
"Y. c #FADD8B",
"T. c #EBD593",
"R. c #EFDA99",
"E. c #F3DD93",
"W. c #F3DF9F",
"Q. c #FFE385",
"!. c #FEE986",
"~. c #FDE48C",
"^. c #FEEC8E",
"/. c #ECE199",
"(. c #F6E591",
"). c #FEE494",
"_. c #FEEB93",
"`. c #FEE69A",
"'. c #FFEB9B",
"]. c #FFF197",
"[. c #FFF39B",
"{. c #FEF99B",
"}. c #F6E2A2",
"|. c #F9E5A5",
" X c #F7E9A5",
".X c #FEECA4",
"XX c #FBE7A8",
"oX c #FDEAAB",
"OX c #F7F2AA",
"+X c #FEF2AC",
"@X c #FDF4B4",
"#X c #FFFABA",
"$X c #FFFEC2",
"%X c None",
/* pixels */
"%X%X%X%X%X%X%X%X%X%X%X%Xp t 6 5 w t w %X%X%X%X%X%X%X%X%X%X%X%X%X",
"%X%X%X%X%X%X%X%X%Xu u x I X.0.s.u.0.W x 7 4 %X%X%X%X%X%X%X%X%X%X",
"%X%X%X%X%X%X%Xy i I i.a.f.m.m.b.f.s.a.s.i.W 7 > %X%X%X%X%X%X%X%X",
"%X%X%X%X%X%Xt M 0.a.m.m.m.m.f.d.p.p.p.f.d.f.i.b 1 < %X%X%X%X%X%X",
"%X%X%X%X%X7 ! d.f.f.m.f.+.W P R I Q 5.v.V.V.z.f.{ 5 + %X%X%X%X%X",
"%X%X%X%Xu X.f.m.m.f.' H s ~ V y _ Z J o.g.L.L.Q.!.e.5 X %X%X%X%X",
"%X%X%Xu X.b.C.m.+.N m n t }.3.> }.w.V 5.y.y.Y.[.^.^.-.1 + %X%X%X",
"%X%Xt P m.N.m.X.v v v k 6 }.1.: /.4.c 7.N.N.v.!.{.{.^.L & %X%X%X",
"%X%Xg Y.Y.V.+.m k a t t : }.1.% }.1.r | l.B.M.b.!.{.^.n.7 X %X%X",
"%Xp -._.'.Y.' Y n D.}.}.|.oXXX|.oX XT.w.F _ j.v.v._.^.C.T & @ %X",
"%Xa (.'.'.9.[ [ K S.}.oXoXoXoXXXoXoXoXoX XD / s.d.v.!.C.v.3 o %X",
"%XU '.'.Y.[ [ [ [ J f <.oXoX( 2 f S J.oXoXT.j r.s.i.C.C.C.z X %X",
"p e.'.'.F. .=.=.=.=.) 1.oXoX@.f . .F oXoX}.a +.i.i.b.C.m.I X O ",
"u w.'.[.j.5.8.7.7.7.] 2.oXoX@.y W c &.oXoXZ.k r.s.i.s.V.m.} = o ",
"u H.[.{.y.8.y.g.8.g.7.2.oXoXA.@.&.D.oXoXT.e G +.O.O.5.V.m.0.- o ",
"u !.].[.r.8.y.g.g.g.7.4.oXoXoXoXoXoXoXoXoX<.y W X.o.o.m.m.0.- o ",
"u B._._.5.5.8.y.g.c.g.w.oXoX,.h A F <..XoXoX1.k ' ' ' V.N.r.- ",
"u u.Q.~.r.6.z.N.V.I.v.k.oXoX@.B | _ c 1.oXoX}.a ' ' O.I.b.O.= o ",
"u ..Q.Q.v.i.s.c.N.L.l.Z.oXoX@.B t.=.S &.oXoXXXy Y R +.N.b.Q % o ",
"t T C.I.I.6.u.z.z.5.S 1.oXoX@.e B h D |.oXoXS.f Y Y 6.d.d.n X O ",
"%Xs m.V.Q.r.r.z.5.<.}.oXoXoXXXW.}.oXoXoXoXW.h G H R a.p.s.7 %X",
"%X7 O.V.V.v.+.r.` 4.oXoXoXoXoXoXoXoXXXR.<.h v N N o.a.p.Q = %X",
"%Xw x v.v.v.r.+. .Z l d e }.Z.r }.3.d l V G n n R a.s.a.s X O %X",
"%X%X6 { v.l.v.+.O.5.=.^ d }.4.9 }.1.f J G m m G d.d.x.Q = %X%X",
"%X%X%Xs u.v.v.v.r.6.o. .l }.4.9 W.4.l ^ ^ J ) c.N.N.y.7 X O %X%X",
"%X%X%X5 z v.v.M.I.g.;. .J 1.#.B 1.#.) 7.$.S..X'.W.Y.j $ %X%X%X",
"%X%X%X%X5 b N.Y.~.).Y.j.5.$.=.=.$.*.2.J.@X$X#X#XoXC $ %X%X%X%X",
"%X%X%X%X%X3 z U.@X+X`.`.`.(.E.E.E.|.@X@X#X#X#X/.j % %X%X%X%X%X",
"%X%X%X%X%X%Xw a q.OX|.).`._.'.'.XX.X.X+X+X X%.w X o %X%X%X%X%X%X",
"%X%X%X%X%X%X%X%Xw a _ j.~.~.).).`.`.`.F._ t & . # %X%X%X%X%X%X%X",
"%X%X%X%X%X%X%X%X%X%X4 3 t z L U Z z t 1 $ . 8 %X%X%X%X%X%X%X%X%X",
"%X%X%X%X%X%X%X%X%X%X%X%X%X< ; & + + , 8 %X%X%X%X%X%X%X%X%X%X%X%X"
};

292
share/pixmaps/bitcoin80.xpm Normal file
View File

@@ -0,0 +1,292 @@
/* XPM */
static const char * bitcoin80_xpm[] = {
/* columns rows colors chars-per-pixel */
"80 80 206 2",
" c #725203",
". c #785706",
"X c #7B5907",
"o c #7C5A09",
"O c #7F5F10",
"+ c #815E0B",
"@ c #85620C",
"# c #89650F",
"$ c #856313",
"% c #896614",
"& c #8D6913",
"* c #886718",
"= c #8D6B1B",
"- c #926D14",
"; c #926E1B",
": c #967116",
"> c #997317",
", c #95711E",
"< c #9B7419",
"1 c #9F781B",
"2 c #A27B1D",
"3 c #8F6F22",
"4 c #926F21",
"5 c #947323",
"6 c #9A7623",
"7 c #9D7925",
"8 c #957628",
"9 c #9A7729",
"0 c #9D7B2B",
"q c #9D7F33",
"w c #A47D23",
"e c #A97F27",
"r c #A37E2B",
"t c #9F8030",
"y c #A78021",
"u c #AC8425",
"i c #A5802D",
"p c #AC842B",
"a c #AF8829",
"s c #B2872C",
"d c #B28B2D",
"f c #A68333",
"g c #AA8633",
"h c #AD8A36",
"j c #A4863A",
"k c #A88638",
"l c #A7893B",
"z c #AC8B3B",
"x c #B28732",
"c c #B48C32",
"v c #B98E34",
"b c #B28D3B",
"n c #B88F3C",
"m c #B69033",
"M c #BD9235",
"N c #B4913D",
"B c #BC943A",
"V c #BE993C",
"C c #C19336",
"Z c #C1953B",
"A c #C49A3C",
"S c #C99C3D",
"D c #CDA13F",
"F c #D0A33F",
"G c #A88B40",
"H c #B08F40",
"J c #AE9142",
"K c #AE944C",
"L c #B49443",
"P c #BB9542",
"I c #B49946",
"U c #BD9846",
"Y c #B3964C",
"T c #BB974A",
"R c #B6994A",
"E c #BF9C4A",
"W c #B69B53",
"Q c #B99D53",
"! c #BCA055",
"~ c #BDA25A",
"^ c #C49742",
"/ c #C49C43",
"( c #CB9E42",
") c #C49D4B",
"_ c #C99E4C",
"` c #C29F52",
"' c #C5A244",
"] c #CDA245",
"[ c #C5A34C",
"{ c #CCA34B",
"} c #CCA94D",
"| c #D2A445",
" . c #D1A54B",
".. c #D5AA4E",
"X. c #DBAF4F",
"o. c #C6A352",
"O. c #CBA554",
"+. c #C5AA57",
"@. c #CEAC54",
"#. c #C4A65A",
"$. c #CDA458",
"%. c #C2A85F",
"&. c #CEAA5B",
"*. c #D0A550",
"=. c #D4AB53",
"-. c #DBAE53",
";. c #D0A75B",
":. c #D4AC5A",
">. c #D9AE5C",
",. c #CEB25E",
"<. c #D4B156",
"1. c #DDB156",
"2. c #D4B25C",
"3. c #DCB35D",
"4. c #D7B85C",
"5. c #DCBA5E",
"6. c #E2B355",
"7. c #E2B65B",
"8. c #E4BA5D",
"9. c #EABD5E",
"0. c #C5AA62",
"q. c #CCAE63",
"w. c #C6AE69",
"e. c #D5AF62",
"r. c #CEB167",
"t. c #CCB36C",
"y. c #D5B162",
"u. c #DCB462",
"i. c #D7B964",
"p. c #DCBC64",
"a. c #D2B66B",
"s. c #DCB669",
"d. c #D7BE69",
"f. c #DFB86A",
"g. c #D0B771",
"h. c #D2BA74",
"j. c #D5BE78",
"k. c #E1B766",
"l. c #E4BB63",
"z. c #E9BE63",
"x. c #E3BB6A",
"c. c #E9BF6A",
"v. c #E1BE72",
"b. c #DDC16B",
"n. c #DAC27E",
"m. c #E4C164",
"M. c #ECC264",
"N. c #E4C36B",
"B. c #EBC36C",
"V. c #E7C96F",
"C. c #EECA6E",
"Z. c #F1C564",
"A. c #F1C76A",
"S. c #F5CB6C",
"D. c #FACE6D",
"F. c #F4D06F",
"G. c #FCD06E",
"H. c #E5C371",
"J. c #EDC573",
"K. c #E4CA73",
"L. c #ECCC74",
"P. c #E7CF7A",
"I. c #EBCD7A",
"U. c #F3CD73",
"Y. c #F8CE71",
"T. c #F3CD7A",
"R. c #EDD076",
"E. c #EDD17B",
"W. c #F4D274",
"Q. c #FBD274",
"!. c #FED977",
"~. c #F3D47B",
"^. c #FDD47A",
"/. c #F5DA7C",
"(. c #FDDA7C",
"). c #FFE07F",
"_. c #DBC481",
"`. c #DFC885",
"'. c #E1CA86",
"]. c #EACC80",
"[. c #E4CD8A",
"{. c #EED383",
"}. c #E7D18F",
"|. c #EAD38C",
" X c #F4D680",
".X c #FDD780",
"XX c #F5DA83",
"oX c #FCDC84",
"OX c #F5DB8A",
"+X c #FADE89",
"@X c #EAD492",
"#X c #EED896",
"$X c #EFDA9A",
"%X c #F1DD9D",
"&X c #FDE283",
"*X c #F6E18D",
"=X c #FEE48D",
"-X c #FFE692",
";X c #FFE894",
":X c #FBE799",
">X c #FFEA98",
",X c #F6E2A3",
"<X c #FAE6A6",
"1X c #FAE7A8",
"2X c #FDEAAB",
"3X c None",
/* pixels */
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u u u u y y u y 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u u u u u u a u u u u u u a u u 2 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u u u u u s m V D ' { ' D M d u u a u u u u 2 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u u u M } m.~.oX=X=X=X=X=X-X-X=X&X/.m.=.V u u a u u w 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u u M 4.~.=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X/.5.Z u u u u u 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u ] V.&X=X=X&X=X=X=X=X=X=X=X=X=X&X=X=X=X=X=X=X=X=X=X=XW.} a u u u 2 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu a u u ' W.=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X+X=X=X=X&X=X=X=X~.} a u u u < 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u M N.=X&X=X=X=X=X=X=X=X-X=X=X=X=X&X=X=X=XoX=X=X=X=X&X+X=X=X=X=X=X=X=XL.M u u u < 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u u } XX=X=X=X&X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X*X=X=X=X=X=X=X=X=X=X=X=X=X=X=XoX<.a u u 2 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u s m.&X=X=X=X=X=X=X=X=X=X=X=X=X=X/.L.M.m.9.m.9.m.C.~.&X*X=X=X=X=X=X=X=X=X=X=X=X=XV.m u u 2 o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3Xu u u c R.=X=X=X=X=X=X=X=X=X=X=XoXC.1.| S S A S D D D D ] ] ..<.N./.=X-X=X-X=X=X=X=X=X=X=XXXZ u a 2 o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3Xu u u m XX=X=X=X=X=X=X=X=X=X=XW.3.| ^ A C M M M C S S A A A / ( { =.<.l.I.=X-X-X=X=X=X=X=X=X=X=XV a u 2 . 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3Xu u m /.=X=X=X-X=X=X=X=X=X~.1.D ] S Z v x p s u s d d v c c v V { =.7.8.7.l.T.=X-X=X-X-X-X-X-X=X=XV u a 1 3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3Xu u d /.=X=X=X=X=X=X=X=X&X8.^ A ( S M v e $.r.e.r.u w i a.a.a.&.b ^ =.l.l.l.c.z.z.XX-X-X-X-X=X-X-X;X&XV u u : 3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3Xu u s R.=X=X=X=X=X=X=X=XU.{ ^ Z C ( A M u w [.2X2X2X0 - 7 2X2X1X@Xi P *.l.x.B.U.C.z.z.W.-X-X-X-X-X-X=X-X*Xd a u # . 3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3Xu u u l.=X=X=X=X-X=X=X=Xm.Z Z Z Z n Z Z v e , '.2X2X2X5 & ; 2X2X2X}.7 b { 3.x.^.^.^.Y.A.z.R.-X;X;X;X;X-X;X-XP.a u y . 3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3Xu u } -X-X=X-X=X=X=X=Xl.M M Z C C C C C x e ; '.2X2X2X, $ = 2X2X2X}.6 h ) >.J..X.X.X.X(.W.Z.C.&X;X;X;X;X-X-X-X<.u u < 3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3Xu u c oX=X=X=X=X=X=X=Xl.Z C M M C C v v v s w = '.2X2X2X5 $ = 2X2X2X}.5 g ) u./.+X+X=X=X=X&XW.Z.F.=X;X;X;X;X-X-X*XV u y @ X 3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3Xu u u N.-X-X-X-X=X=X=XB.Z M C v v s e e e e w > % `.2X2X2X= + % 2X2X2X}.= r L 4.E.OX+X-X=X=X&X).W.M.R.;X;X;X-X-X-X;XR.u u y 3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3Xu u U -X-X-X-X-X-X=XW.^ C C C x e e r 6 5 4 ; = $ `.2X2X2X= O = 2X2X2X}.O = t Q ,.b.P./.*X=X&X&X).F.M.W.;X;X;X;X&X-X&X} u u O 3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3Xu u u R.-X-X-X-X-X-X=X=.{ ^ Z C x n 2X2X<X<X1X2X<X<X2X2X2X2X1X1X<X2X2X2X<X$X[.b.~ J I ~ b.P.&X&X&X).!.F.m.).;X;X;X;X;X&X).u y y 3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3Xu u U -X-X-X-X-X-X-Xc.=.=. ._ ^ x z 2X2X1X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X<Xn.l I ,.K./.).).).F.Z.Z.&X;X;X=X-X-X&X} u u O 3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3Xu u V.-X;X-X-X-X-XOX>.>.>.=.=._ n b 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X:XI N +.V./.).).F.F.9.W.;X=X;X-X-X-XR.u u > 3X3X3X3X3X3X3X3X",
"3X3X3X3X3Xu u d =X;X-X-X-X-X-Xx.>.>.>.>.>...^ P 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X,Xl N 4.R.!.!.!.G.Z.M.&X;X=X=X-X-X-XB a u 3X3X3X3X3X3X3X",
"3X3X3X3X3Xu u @.;X;X-X;X;X;XXX>.:.>.>.>.>.>._ P ` Y Y W _.2X2X2X2X2X2X@XW W ~ 0.t.'.<X2X2X2X2X2X2X2X2X'.0 ' m./.!.!.Q.S.9.F.=X;X-X=X-X&X4.u u @ 3X3X3X3X3X3X3X",
"3X3X3X3X3Xu u P.;X;X;X;X-X:XN.>.>.>.>.>.>.>.=._ P z r 4 8 2X2X2X2X2X2X_.. $ , 6 1 3 t ~ 1X2X2X2X2X2X2X2Xt B 5.G.!.!.G.G.M.9.&X;X=X-X-X=X/.u u > 3X3X3X3X3X3X3X",
"3X3X3X3Xu u d =X;X;X=X;X;X=X3.>.>.>.e.>.3.3.>.:.*._ P r 9 2X2X2X2X2X1Xn.@ , c B N m h 8 ~ 2X2X2X2X2X2X2XI h <.F.!.G.G.F.M.9.W.;X=X-X-X=X=Xm u y . 3X3X3X3X3X3X",
"3X3X3X3Xu u ' -X-X>X-X-X-X X>.>.>.>.>.>.>.u.u.u.u.3.$.P f 2X2X2X2X2X2X_.$ i / -.<.8.} h 8 1X2X2X2X2X2X2X! i <.S.G.G.G.G.Z.9.Z.=X-X=X-X&X-X} u u X 3X3X3X3X3X3X",
"3X3X3X3Xu u 4.-X-X-X-X-X-XJ.3.>.>.k.k.k.k.k.u.k.u.u.:.U k 2X2X2X2X2X1X_.% f } 8.Z.F.8.U 8 ,X2X2X2X2X2X2XI g } Z.D.G.D.G.D.Z.9.&X-X=X=X=X-Xm.u u @ 3X3X3X3X3X3X",
"3X3X3X3Xu u K.;X-X;X-X>X-Xk.3.k.k.k.k.k.k.k.k.k.k.u.e.U k 2X2X2X2X2X2X_.% f [ 8.F.M.<.b i 2X2X2X2X2X2X2Xt a X.Z.D.D.D.G.G.Z.9./.=X-X=X=X=XR.u u & 3X3X3X3X3X3X",
"3X3X3X3Xu u E.;X-X;X-X-X=Xl.l.x.c.k.x.k.k.x.x.v.x.x.u.) z 2X2X2X2X2X2X_.$ 7 L <.<.} N 6 h.2X2X2X2X2X2X_.: V 1.S.D.D.G.D.S.M.6.W.-X=X-X=X=X&Xu u > X 3X3X3X3X3X",
"3X3X3Xu a u =X;X;X;X;X;XoX7.z.c.c.c.c.c.c.c.c.c.x.k.u.) z 2X2X2X2X2X2Xn.o = i N h i l n.2X2X2X2X2X2X<Xt t D 7.M.Z.z.z.9.9.9.6.M.-X=X=X=X;X=Xm u 1 3X3X3X3X3X",
"3X3X3Xy u a =X;X;X;X;X;XXXl.z.c.c.c.c.T.J.J.T.v.J.J.s.` z 2X2X2X2X2X2X#XW ~ ~ t.n.$X2X2X2X2X2X2X2X,Xt % t V X.8.9.8.9.9.9.6.6.M.-X=X=X=X=X&XM u 2 3X3X3X3X3X",
"3X3X3Xu u m -X-X-X;X;X;X~.z.z.c.c.c.c..XJ.J.J.J.J.J.x.O.b 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2Xw.$ * y V X.7.8.8.9.7.8.7.6.8.=X=X-X-X=X-XV a y 3X3X3X3X3X",
"3X3X3Xu a m -X-X-X;X;X;X~.7.z.c.c.c.c.c.c.J.T.J.T.J.B.O.b 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X,X~ , c ' X.6.6.7.6.6.6.6.8.=X=X=X-X&X-XV u y 3X3X3X3X3X",
"3X3X3Xu u m -X-X-X-X-X-X/.8.l.z.c.T.c.J.c.J.T.v.J.J.x.O.G 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2Xn.r v { 6.6.6.6.6.6.-.7.&X-X=X=X=X-XD u y 3X3X3X3X3X",
"3X3X3Xu u d =X-X-X-X-X-X~.7.z.z.c.c.c.c.c.J.c.T.T.^.T.y.R 2X2X2X2X2X2X@XK K W W W ~ h.#X1X2X2X2X2X2X2X2X2Xa.i Z ..X.6.6.-.-.6.7.-X-X-X-X-X-XD u 2 3X3X3X3X3X",
"3X3X3Xw u a =X-X-X-X-X-X~.7.7.8.c.c.c.c.T..X.X+X+X+XXXi.R 2X2X2X2X2X2Xn.. * 5 8 5 3 = * q `.2X2X2X2X2X2X2X<Xk c | X.6.-.-.-.-.z.&X;X=X;X-X;XV u w 3X3X3X3X3X",
"3X3X3Xu u u =X-X=X-X-X-X/.8.M.B.Y.T.^.^.^..X.XoXoX+XXXi.R 2X2X2X2X2X2X_.$ 0 b U U N l t 5 $ `.2X2X2X2X2X2X2X0.e Z .....-.-.6.c.;X=X;X=X;X-Xd u 1 3X3X3X3X3X",
"3X3X3X3Xu a E.-X-X-X-X-X=Xz.S.D.Y.^.Q.^.^.^..XoX+X+XXXi.R 2X2X2X2X2X2X_.= l +.u.i.,.O.E h 5 G 2X2X2X2X2X2X2X_.0 n | . .*. .*.T.-X;X;X;X-X=Xa u : 3X3X3X3X3X",
"3X3X3X3Xu u N.-X-X-X=X-X-XA.Z.S.Y.Q.Q.^.^..X.XoXoX&X.Xi.R 2X2X2X2X2X2X_.= N y.H.H.m.i.y.E f 8 2X2X2X2X2X2X2X'.6 n | . . . . ..X;X;X;X;X-X~.u u & 3X3X3X3X3X",
"3X3X3X3Xu u <.-X-X=X=X-X-XW.Z.S.Y.Y.Q.^.^.^.(..XoX=XXXi.R 2X2X2X2X2X2X_.= L 4.H.J.H.x.i.o.k j 2X2X2X2X2X2X2X_.6 B . . . .{ =.-X;X-X;X-X-Xb.a u @ 3X3X3X3X3X",
"3X3X3X3Xy a V =X=X-X-X=X-XXXZ.S.Y.Y.Y.Q.!.^..X.XoXoXE.y.I 2X2X2X2X2X2X_.= J y.b.H.N.p.&.P 0 g.2X2X2X2X2X2X2Xr.r B _ { .| ] l.-X;X;X-X-X;X..u u . . 3X3X3X3X3X",
"3X3X3X3Xy u a =X=X=X=X-X=X-XM.Z.S.Y.Y.Q.Q.^.^.^.U.J.u.E l 2X2X2X2X2X2X_.* k o.e.e.$.` P q W 1X2X2X2X2X2X2X2XG i B ] | ] ] ( ~.=X;X;X;X;X;XM u y 3X3X3X3X3X3X",
"3X3X3X3X3Xu u V.-X=X-X=X-X-XF.M.A.D.Y.Q.Y.Q.Y.B.2.[ N 0 j 2X2X2X2X2X2X_.O 5 l G z H H Q _.2X2X2X2X2X2X2X2X#X, g ^ ] ] | ] ..-X-X-X-X&X;X).u u : 3X3X3X3X3X3X",
"3X3X3X3X3Xu u } =X=X=X=X-X=X&XM.Z.S.D.W.Q.Y.B.*.a.#X@X|.,X2X2X2X2X2X2X,X[.[.}.}.%X<X2X2X2X2X2X2X2X2X2X2X<Xj 6 b / ] ] ] ] M.-X-X-X-X-X-X4.u u O 3X3X3X3X3X3X",
"3X3X3X3X3Xy u d =X=X=X=X=X=X-XS.M.A.S.S.U.A.u.) n.2X2X2X2X2X2X2X2X2X2X2X2X1X2X2X2X2X2X2X2X2X2X2X2X2X2X2XW ; i M ( S S S ] &X-X-X-X-X=X-Xm u y . X 3X3X3X3X3X3X",
"3X3X3X3X3X3Xu u p.=X=X=X=X=X-X&X9.Z.C.S.S.M.:.b [.2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X%XG = r x v C D D D m.-X-X-X-X-X-XR.u u : 3X3X3X3X3X3X3X",
"3X3X3X3X3X3Xy u B =X=X=X=X=X=X=XF.9.M.A.C.M.=.h %X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X1X#X~ 4 ; r p v v M C A | &X-X-X-X-X-X-X] u u X 3X3X3X3X3X3X3X",
"3X3X3X3X3X3Xy u u N.=X=X-X=X-X=X=XM.z.M.M.M.1.V #X%X%X%X%X$X%X%X<X2X2X2X%X$X%X2X2X2X<X[.n.t.W q = , r i x v C C C M C W.-X-X-X-X-X-X/.u u 1 X 3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3Xu u V *X=X=X*X=X=X=XoX8.M.M.M.5.{ m r , ; $ $ o o `.2X2X2X3 o $ 2X2X2X[.o $ 4 9 0 r g x v m C M C C C 8.&X-X-X-X-X-X-X[ u u @ 3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X2 u u 5.=X=X=X=X=X=X=XI.8.M.M.z.3.O.) P b r 0 4 % `.2X2X2X3 $ * 2X2X2X[.$ 4 r e ^ n n Z Z Z C C C M | =X=X-X-X-X-X-XR.u u < 3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3Xy u d XX=X=X=X=X-X=X=XS.8.8.M.M.z.z.7.{ _ U g 5 `.2X2X2X8 = 3 2X2X2X}.3 0 x ^ _ ^ ^ ^ Z ^ B ^ C .&X-X-X-X-X-X-X=XB u u o 3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X1 u u ' =X=X*X=X=X*X=X=XW.8.M.M.A.S.l.u.>.o.L r [.2X2X2X9 = 8 2X2X2X}.4 r ^ _ *.*._ ) ) ^ ^ ^ O.oX=X-X-X-X-X-X-X<.u u : . 3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3Xy u u i.=X=X=X=X=X-X*X=XW.9.M.A.B.3.5.5.;.U f [.2X2X2Xq 4 8 2X2X2X}.r q _ _ ;.;.*._ _ ` _ e.+X-X-X-X-X-X-X-XR.a u 2 3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3Xu u u K.=X=X=X-X=X=X=X=XXXz.M.8.5.8.u.:.) h }.2X2X2Xj r f 2X2X2X@Xq T _ e.e.u.e.;.$.$.b.-X-X-X=X;X=X;X-X&Xa a u + 3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3Xu u d ~.=X=X=X=X=X-X=X-X+XC.3.5.7.7.2.@.) q.r.q.q.H H L g.r.w.q.T ` e.k.v.k.k.s.s.{.-X-X;X-X;X;X;X;X*XV u u & . 3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X2 u u c XX-X=X=X=X=X-X=X-X-X Xl.7.7.u.2.$.o.[ [ o.O.$.&.&.` ` ` q.s.k.v.k.k.x.{.%X>X>X>X;X>X;X>X>X*XV u u > 3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X2 u u m ~.=X-X-X-X=X-X-X-X-X-X Xc.7.5.u.3.e.y.u.s.f.k.s.e.e.s.s.k.k.k.v. X:X>X>X>X>X>X>X;X>X>X*XV u u < 3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u d R.-X=X-X=X-X-X-X-X-X-X-X+XI.v.u.s.l.k.k.x.x.x.s.s.s.s.j.].+X>X>X>X>X>X:X>X>X>X>X>XOXV u u 1 3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u a p.-X-X-X;X;X;X-X-X-X:X-X-X-X-XOX XL.J.J.J.L.I.].OX:X>X-X>X>X-X>X>X>X>X>X>X>X>XK.a a u < 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u u @.=X;X;X>X;X-X-X>X-X-X-X-X;X-X-X-X-X-X>X>X-X>X-X>X>X>X>X;X>X>X>X-X>X-X-X:X<.u u u > 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X1 u u u m n.>X;X>X>X-X-X-X-X>X-X-X-X;X;X;X-X-X-X-X-X>X-X-X>X-X>X>X-X>X>X>X>XK.B u u u & 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xw u u u / {.>X>X-X-X-X-X-X-X-X-X-X-X;X-X-X;X:X-X-X>X-X:X>X;X;X>X;X;X{.[ u u u w + 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u u u ) K.-X-X-X-X:X-X-X-X-X-X-X-X-X-X-X-X-X>X-X-X-X-X-X-XE.[ u u u u - . 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X1 u u u u m 2.E.-X+X:X-X-X-X-X-X-X-X-X-X:X-X-X-X;X-XOXi.B u u u u 1 o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X> u u u u u v [ l.I.OX-X-X-X-X-X-X-X-X+XI.f.@.m u u u u u 1 + o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X& 2 u u u u u u u d B V V V V B d u u u u u u u y - . o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X+ - 1 u u u u u u u a u u u u u u u u 2 - o o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xo . X # - > 1 2 2 2 1 2 > - # o . o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xo o . o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X",
"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X"
};

View File

@@ -21,7 +21,7 @@
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
// Encode a byte sequence as a base58-encoded string
inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
{
CAutoBN_CTX pctx;
@@ -62,11 +62,14 @@ inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char
return str;
}
// Encode a byte vector as a base58-encoded string
inline std::string EncodeBase58(const std::vector<unsigned char>& vch)
{
return EncodeBase58(&vch[0], &vch[0] + vch.size());
}
// Decode a base58-encoded string psz into byte vector vchRet
// returns true if decoding is succesful
inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet)
{
CAutoBN_CTX pctx;
@@ -113,6 +116,8 @@ inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet)
return true;
}
// Decode a base58-encoded string str into byte vector vchRet
// returns true if decoding is succesful
inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet)
{
return DecodeBase58(str.c_str(), vchRet);
@@ -121,7 +126,7 @@ inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vch
// Encode a byte vector to a base58-encoded string, including checksum
inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn)
{
// add 4-byte hash check to the end
@@ -131,6 +136,8 @@ inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn)
return EncodeBase58(vch);
}
// Decode a base58-encoded string psz that includes a checksum, into byte vector vchRet
// returns true if decoding is succesful
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet)
{
if (!DecodeBase58(psz, vchRet))
@@ -150,6 +157,8 @@ inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRe
return true;
}
// Decode a base58-encoded string str that includes a checksum, into byte vector vchRet
// returns true if decoding is succesful
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet)
{
return DecodeBase58Check(str.c_str(), vchRet);
@@ -159,11 +168,14 @@ inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>
// Base class for all base58-encoded data
class CBase58Data
{
protected:
// the version byte
unsigned char nVersion;
// the actually encoded data
std::vector<unsigned char> vchData;
CBase58Data()
@@ -174,6 +186,7 @@ protected:
~CBase58Data()
{
// zero the memory, as it may contain sensitive data
if (!vchData.empty())
memset(&vchData[0], 0, vchData.size());
}
@@ -238,7 +251,9 @@ public:
bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; }
};
// base58-encoded bitcoin addresses
// Addresses have version 0 or 111 (testnet)
// The data vector contains RIPEMD160(SHA256(pubkey)), where pubkey is the serialized public key
class CBitcoinAddress : public CBase58Data
{
public:

View File

@@ -160,10 +160,13 @@ Value stop(const Array& params, bool fHelp)
throw runtime_error(
"stop\n"
"Stop bitcoin server.");
#ifndef QT_GUI
// Shutdown will take long enough that the response should get back
CreateThread(Shutdown, NULL);
return "bitcoin server stopping";
#else
throw runtime_error("NYI: cannot shut down GUI with RPC command");
#endif
}
@@ -1554,6 +1557,11 @@ Value encryptwallet(const Array& params, bool fHelp)
if (pwalletMain->IsCrypted())
throw JSONRPCError(-15, "Error: running with an encrypted wallet, but encryptwallet was called.");
#ifdef QT_GUI
// shutting down via RPC while the GUI is running does not work (yet):
throw runtime_error("Not Yet Implemented: use GUI to encrypt wallet, not RPC command");
#endif
string strWalletPass;
strWalletPass.reserve(100);
mlock(&strWalletPass[0], strWalletPass.capacity());
@@ -1573,7 +1581,11 @@ Value encryptwallet(const Array& params, bool fHelp)
fill(strWalletPass.begin(), strWalletPass.end(), '\0');
munlock(&strWalletPass[0], strWalletPass.capacity());
return Value::null;
// BDB seems to have a bad habit of writing old data into
// slack space in .dat files; that is bad if the old data is
// unencrypted private keys. So:
CreateThread(Shutdown, NULL);
return "wallet encrypted; bitcoin server stopping, restart to run with encrypted wallet";
}
@@ -2175,11 +2187,13 @@ void ThreadRPCServer2(void* parg)
else if (mapArgs.count("-daemon"))
strWhatAmI = strprintf(_("To use the %s option"), "\"-daemon\"");
PrintConsole(
_("Warning: %s, you must set rpcpassword=<password>\nin the configuration file: %s\n"
_("Error: %s, you must set rpcpassword=<password>\nin the configuration file: %s\n"
"If the file does not exist, create it with owner-readable-only file permissions.\n"),
strWhatAmI.c_str(),
GetConfigFile().c_str());
#ifndef QT_GUI
CreateThread(Shutdown, NULL);
#endif
return;
}

View File

@@ -13,15 +13,15 @@ const unsigned int WALLET_CRYPTO_SALT_SIZE = 8;
Private key encryption is done based on a CMasterKey,
which holds a salt and random encryption key.
CMasterKeys is encrypted using AES-256-CBC using a key
CMasterKeys are encrypted using AES-256-CBC using a key
derived using derivation method nDerivationMethod
(0 == EVP_sha512()) and derivation iterations nDeriveIterations.
vchOtherDerivationParameters is provided for alternative algorithms
which may require more parameters (such as scrypt).
Wallet Private Keys are then encrypted using AES-256-CBC
with the double-sha256 of the private key as the IV, and the
master key's key as the encryption key.
with the double-sha256 of the public key as the IV, and the
master key's key as the encryption key (see keystore.[ch]).
*/
class CMasterKey

View File

@@ -28,6 +28,46 @@ DbEnv dbenv(0);
static map<string, int> mapFileUseCount;
static map<string, Db*> mapDb;
static bool fRemoveLogFiles = false;
void RemoveLogFilesOnShutdown(bool fIn)
{
fRemoveLogFiles = fIn;
}
static void EnvShutdown()
{
if (!fDbEnvInit)
return;
fDbEnvInit = false;
try
{
dbenv.close(0);
}
catch (const DbException& e)
{
printf("EnvShutdown exception: %s (%d)\n", e.what(), e.get_errno());
}
DbEnv(0).remove(GetDataDir().c_str(), 0);
if (fRemoveLogFiles)
{
filesystem::path datadir(GetDataDir());
filesystem::directory_iterator it(datadir / "database");
while (it != filesystem::directory_iterator())
{
const filesystem::path& p = it->path();
#if BOOST_FILESYSTEM_VERSION >= 3
std::string f = p.filename().generic_string();
#else
std::string f = p.filename();
#endif
if (f.find("log.") == 0)
filesystem::remove(p);
++it;
}
}
}
class CDBInit
{
public:
@@ -36,11 +76,7 @@ public:
}
~CDBInit()
{
if (fDbEnvInit)
{
dbenv.close(0);
fDbEnvInit = false;
}
EnvShutdown();
}
}
instance_of_cdbinit;
@@ -165,6 +201,99 @@ void static CloseDb(const string& strFile)
}
}
bool CDB::Rewrite(const string& strFile, const char* pszSkip)
{
while (!fShutdown)
{
CRITICAL_BLOCK(cs_db)
{
if (!mapFileUseCount.count(strFile) || mapFileUseCount[strFile] == 0)
{
// Flush log data to the dat file
CloseDb(strFile);
dbenv.txn_checkpoint(0, 0, 0);
dbenv.lsn_reset(strFile.c_str(), 0);
mapFileUseCount.erase(strFile);
bool fSuccess = true;
printf("Rewriting %s...\n", strFile.c_str());
string strFileRes = strFile + ".rewrite";
CDB db(strFile.c_str(), "r");
Db* pdbCopy = new Db(&dbenv, 0);
int ret = pdbCopy->open(NULL, // Txn pointer
strFileRes.c_str(), // Filename
"main", // Logical db name
DB_BTREE, // Database type
DB_CREATE, // Flags
0);
if (ret > 0)
{
printf("Cannot create database file %s\n", strFileRes.c_str());
fSuccess = false;
}
Dbc* pcursor = db.GetCursor();
if (pcursor)
while (fSuccess)
{
CDataStream ssKey;
CDataStream ssValue;
int ret = db.ReadAtCursor(pcursor, ssKey, ssValue, DB_NEXT);
if (ret == DB_NOTFOUND)
{
pcursor->close();
break;
}
else if (ret != 0)
{
pcursor->close();
fSuccess = false;
break;
}
if (pszSkip &&
strncmp(&ssKey[0], pszSkip, std::min(ssKey.size(), strlen(pszSkip))) == 0)
continue;
if (strncmp(&ssKey[0], "\x07version", 8) == 0)
{
// Update version:
ssValue.clear();
ssValue << VERSION;
}
Dbt datKey(&ssKey[0], ssKey.size());
Dbt datValue(&ssValue[0], ssValue.size());
int ret2 = pdbCopy->put(NULL, &datKey, &datValue, DB_NOOVERWRITE);
if (ret2 > 0)
fSuccess = false;
}
if (fSuccess)
{
db.Close();
CloseDb(strFile);
if (pdbCopy->close(0))
fSuccess = false;
delete pdbCopy;
}
if (fSuccess)
{
Db dbA(&dbenv, 0);
if (dbA.remove(strFile.c_str(), NULL, 0))
fSuccess = false;
Db dbB(&dbenv, 0);
if (dbB.rename(strFileRes.c_str(), NULL, strFile.c_str(), 0))
fSuccess = false;
}
if (!fSuccess)
printf("Rewriting of %s FAILED!\n", strFileRes.c_str());
return fSuccess;
}
}
Sleep(100);
}
return false;
}
void DBFlush(bool fShutdown)
{
// Flush log data to the actual data file
@@ -196,9 +325,10 @@ void DBFlush(bool fShutdown)
{
char** listp;
if (mapFileUseCount.empty())
{
dbenv.log_archive(&listp, DB_ARCH_REMOVE);
dbenv.close(0);
fDbEnvInit = false;
EnvShutdown();
}
}
}
}
@@ -656,6 +786,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
pwallet->vchDefaultKey.clear();
int nFileVersion = 0;
vector<uint256> vWalletUpgrade;
bool fIsEncrypted = false;
// Modify defaults
#ifndef WIN32
@@ -781,6 +912,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
ssValue >> vchPrivKey;
if (!pwallet->LoadCryptedKey(vchPubKey, vchPrivKey))
return DB_CORRUPT;
fIsEncrypted = true;
}
else if (strType == "defaultkey")
{
@@ -841,8 +973,11 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
printf("fUseUPnP = %d\n", fUseUPnP);
// Upgrade
if (nFileVersion < VERSION)
// Rewrite encrypted wallets of versions 0.4.0 and 0.5.0rc:
if (fIsEncrypted && (nFileVersion == 40000 || nFileVersion == 50000))
return DB_NEED_REWRITE;
if (nFileVersion < VERSION) // Update
{
// Get rid of old debug.log file in current directory
if (nFileVersion <= 105 && !pszSetDataDir[0])
@@ -851,7 +986,6 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
WriteVersion(VERSION);
}
return DB_LOAD_OK;
}

View File

@@ -29,13 +29,13 @@ extern unsigned int nWalletDBUpdated;
extern DbEnv dbenv;
extern void RemoveLogFilesOnShutdown(bool fRemoveLogFiles);
extern void DBFlush(bool fShutdown);
void ThreadFlushWalletDB(void* parg);
bool BackupWallet(const CWallet& wallet, const std::string& strDest);
class CDB
{
protected:
@@ -257,6 +257,8 @@ public:
{
return Write(std::string("version"), nVersion);
}
bool static Rewrite(const std::string& strFile, const char* pszSkip = NULL);
};
@@ -349,6 +351,7 @@ enum DBErrors
DB_CORRUPT,
DB_TOO_NEW,
DB_LOAD_FAIL,
DB_NEED_REWRITE
};
class CWalletDB : public CDB

View File

@@ -44,8 +44,8 @@ void Shutdown(void* parg)
{
static CCriticalSection cs_Shutdown;
static bool fTaken;
bool fFirstThread;
CRITICAL_BLOCK(cs_Shutdown)
bool fFirstThread = false;
TRY_CRITICAL_BLOCK(cs_Shutdown)
{
fFirstThread = !fTaken;
fTaken = true;
@@ -362,6 +362,12 @@ bool AppInit2(int argc, char* argv[])
strErrors += _("Error loading wallet.dat: Wallet corrupted \n");
else if (nLoadWalletRet == DB_TOO_NEW)
strErrors += _("Error loading wallet.dat: Wallet requires newer version of Bitcoin \n");
else if (nLoadWalletRet == DB_NEED_REWRITE)
{
strErrors += _("Wallet needed to be rewritten: restart Bitcoin to complete \n");
wxMessageBox(strErrors, "Bitcoin", wxOK | wxICON_ERROR);
return false;
}
else
strErrors += _("Error loading wallet.dat \n");
}

View File

@@ -39,6 +39,7 @@
// see www.keylength.com
// script supports up to 75 for single byte push
// Generate a private key from just the secret parameter
int static inline EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key)
{
int ok = 0;
@@ -75,6 +76,9 @@ err:
return(ok);
}
// Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields
// recid selects which key is recovered
// if check is nonzero, additional checks are performed
int static inline ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check)
{
if (!eckey) return 0;
@@ -154,7 +158,9 @@ public:
// secure_allocator is defined in serialize.h
// CPrivKey is a serialized private key, with all parameters included (279 bytes)
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CPrivKey;
// CSecret is a serialization of just the secret parameter (32 bytes)
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CSecret;
class CKey
@@ -292,6 +298,9 @@ public:
}
// create a compact signature (65 bytes), which allows reconstructing the used public key
// The format is one header byte, followed by two times 32 bytes for the serialized r and s values.
// The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,
// 0x1D = second key with even y, 0x1E = second key with odd y
bool SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)
{
bool fOk = false;
@@ -318,7 +327,7 @@ public:
}
if (nRecId == -1)
throw key_error("CKEy::SignCompact() : unable to construct recoverable key");
throw key_error("CKey::SignCompact() : unable to construct recoverable key");
vchSig[0] = nRecId+27;
BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]);
@@ -330,6 +339,9 @@ public:
}
// reconstruct public key from a compact signature
// This is only slightly more CPU intensive than just verifying it.
// If this function succeeds, the recovered public key is guaranteed to be valid
// (the signature is a valid signature of the given data for that key)
bool SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig)
{
if (vchSig.size() != 65)
@@ -359,6 +371,7 @@ public:
return true;
}
// Verify a compact signature
bool VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig)
{
CKey key;
@@ -369,6 +382,7 @@ public:
return true;
}
// Get the address corresponding to this key
CBitcoinAddress GetAddress() const
{
return CBitcoinAddress(GetPubKey());

View File

@@ -7,21 +7,34 @@
#include "crypter.h"
// A virtual base class for key stores
class CKeyStore
{
protected:
mutable CCriticalSection cs_KeyStore;
public:
// Add a key to the store.
virtual bool AddKey(const CKey& key) =0;
// Check whether a key corresponding to a given address is present in the store.
virtual bool HaveKey(const CBitcoinAddress &address) const =0;
// Retrieve a key corresponding to a given address from the store.
// Return true if succesful.
virtual bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const =0;
// Retrieve only the public key corresponding to a given address.
// This may succeed even if GetKey fails (e.g., encrypted wallets)
virtual bool GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char>& vchPubKeyOut) const;
// Generate a new key, and add it to the store
virtual std::vector<unsigned char> GenerateNewKey();
};
typedef std::map<CBitcoinAddress, CSecret> KeyMap;
// Basic key store, that keeps keys in an address->secret map
class CBasicKeyStore : public CKeyStore
{
protected:
@@ -53,6 +66,8 @@ public:
typedef std::map<CBitcoinAddress, std::pair<std::vector<unsigned char>, std::vector<unsigned char> > > CryptedKeyMap;
// Keystore which keeps the private keys encrypted
// It derives from the basic key store, which is used if no encryption is active.
class CCryptoKeyStore : public CBasicKeyStore
{
private:

View File

@@ -70,6 +70,9 @@ int fUseUPnP = false;
// dispatching functions
//
// These functions dispatch to one or all registered wallets
void RegisterWallet(CWallet* pwalletIn)
{
CRITICAL_BLOCK(cs_setpwalletRegistered)
@@ -86,6 +89,7 @@ void UnregisterWallet(CWallet* pwalletIn)
}
}
// check whether the passed transaction is from us
bool static IsFromMe(CTransaction& tx)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
@@ -94,6 +98,7 @@ bool static IsFromMe(CTransaction& tx)
return false;
}
// get the wallet transaction with the given hash (if it exists)
bool static GetTransaction(const uint256& hashTx, CWalletTx& wtx)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
@@ -102,42 +107,49 @@ bool static GetTransaction(const uint256& hashTx, CWalletTx& wtx)
return false;
}
// erases transaction with the given hash from all wallets
void static EraseFromWallets(uint256 hash)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
pwallet->EraseFromWallet(hash);
}
// make sure all wallets know about the given transaction, in the given block
void static SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
pwallet->AddToWalletIfInvolvingMe(tx, pblock, fUpdate);
}
// notify wallets about a new best chain
void static SetBestChain(const CBlockLocator& loc)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
pwallet->SetBestChain(loc);
}
// notify wallets about an updated transaction
void static UpdatedTransaction(const uint256& hashTx)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
pwallet->UpdatedTransaction(hashTx);
}
// dump all wallets
void static PrintWallets(const CBlock& block)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
pwallet->PrintWallet(block);
}
// notify wallets about an incoming inventory (for request counts)
void static Inventory(const uint256& hash)
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
pwallet->Inventory(hash);
}
// ask wallets to resend their transactions
void static ResendWalletTransactions()
{
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)

View File

@@ -12,7 +12,10 @@ AboutDialog::AboutDialog(QWidget *parent) :
void AboutDialog::setModel(ClientModel *model)
{
ui->versionLabel->setText(model->formatFullVersion());
if(model)
{
ui->versionLabel->setText(model->formatFullVersion());
}
}
AboutDialog::~AboutDialog()

View File

@@ -57,6 +57,8 @@ AddressBookPage::~AddressBookPage()
void AddressBookPage::setModel(AddressTableModel *model)
{
this->model = model;
if(!model)
return;
// Refresh list from core
model->updateList();
@@ -96,16 +98,13 @@ void AddressBookPage::setModel(AddressTableModel *model)
selectionChanged();
}
QTableView *AddressBookPage::getCurrentTable()
{
return ui->tableView;
}
void AddressBookPage::on_copyToClipboard_clicked()
{
// Copy currently selected address to clipboard
// (or nothing, if nothing selected)
QTableView *table = getCurrentTable();
QTableView *table = ui->tableView;
if(!table->selectionModel())
return;
QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
foreach (QModelIndex index, indexes)
@@ -117,6 +116,8 @@ void AddressBookPage::on_copyToClipboard_clicked()
void AddressBookPage::on_newAddressButton_clicked()
{
if(!model)
return;
EditAddressDialog dlg(
tab == SendingTab ?
EditAddressDialog::NewSendingAddress :
@@ -139,7 +140,9 @@ void AddressBookPage::on_newAddressButton_clicked()
void AddressBookPage::on_deleteButton_clicked()
{
QTableView *table = getCurrentTable();
QTableView *table = ui->tableView;
if(!table->selectionModel())
return;
QModelIndexList indexes = table->selectionModel()->selectedRows();
if(!indexes.isEmpty())
{
@@ -150,7 +153,9 @@ void AddressBookPage::on_deleteButton_clicked()
void AddressBookPage::selectionChanged()
{
// Set button states based on selected tab and selection
QTableView *table = getCurrentTable();
QTableView *table = ui->tableView;
if(!table->selectionModel())
return;
if(table->selectionModel()->hasSelection())
{
@@ -174,12 +179,14 @@ void AddressBookPage::selectionChanged()
void AddressBookPage::done(int retval)
{
QTableView *table = ui->tableView;
if(!table->selectionModel() || !table->model())
return;
// When this is a tab/widget and not a model dialog, ignore "done"
if(mode == ForEditing)
return;
// Figure out which address was selected, and return it
QTableView *table = getCurrentTable();
QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
foreach (QModelIndex index, indexes)

View File

@@ -47,8 +47,6 @@ private:
QString returnValue;
QSortFilterProxyModel *proxyModel;
QTableView *getCurrentTable();
private slots:
void on_deleteButton_clicked();
void on_newAddressButton_clicked();

View File

@@ -72,6 +72,8 @@ void AskPassphraseDialog::setModel(WalletModel *model)
void AskPassphraseDialog::accept()
{
std::string oldpass, newpass1, newpass2;
if(!model)
return;
// TODO: mlock memory / munlock on return so they will not be swapped out, really need "mlockedstring" wrapper class to do this safely
oldpass.reserve(MAX_PASSPHRASE_SIZE);
newpass1.reserve(MAX_PASSPHRASE_SIZE);
@@ -99,7 +101,8 @@ void AskPassphraseDialog::accept()
if(model->setWalletEncrypted(true, newpass1))
{
QMessageBox::warning(this, tr("Wallet encrypted"),
tr("Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer."));
tr("Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer."));
QApplication::quit();
}
else
{

View File

@@ -46,6 +46,7 @@
<file alias="update_spinner">res/movies/update_spinner.mng</file>
</qresource>
<qresource prefix="/translations">
<file alias="da">locale/bitcoin_da.qm</file>
<file alias="de">locale/bitcoin_de.qm</file>
<file alias="en">locale/bitcoin_en.qm</file>
<file alias="es">locale/bitcoin_es.qm</file>
@@ -53,5 +54,6 @@
<file alias="nb">locale/bitcoin_nb.qm</file>
<file alias="nl">locale/bitcoin_nl.qm</file>
<file alias="ru">locale/bitcoin_ru.qm</file>
<file alias="zh_TW">locale/bitcoin_zh_TW.qm</file>
</qresource>
</RCC>

View File

@@ -267,58 +267,62 @@ void BitcoinGUI::createToolBars()
void BitcoinGUI::setClientModel(ClientModel *clientModel)
{
this->clientModel = clientModel;
if(clientModel->isTestNet())
if(clientModel)
{
QString title_testnet = windowTitle() + QString(" ") + tr("[testnet]");
setWindowTitle(title_testnet);
#ifndef Q_WS_MAC
setWindowIcon(QIcon(":icons/bitcoin_testnet"));
#else
MacDockIconHandler::instance()->setIcon(QIcon(":icons/bitcoin_testnet"));
#endif
if(trayIcon)
if(clientModel->isTestNet())
{
trayIcon->setToolTip(title_testnet);
trayIcon->setIcon(QIcon(":/icons/toolbar_testnet"));
QString title_testnet = windowTitle() + QString(" ") + tr("[testnet]");
setWindowTitle(title_testnet);
#ifndef Q_WS_MAC
setWindowIcon(QIcon(":icons/bitcoin_testnet"));
#else
MacDockIconHandler::instance()->setIcon(QIcon(":icons/bitcoin_testnet"));
#endif
if(trayIcon)
{
trayIcon->setToolTip(title_testnet);
trayIcon->setIcon(QIcon(":/icons/toolbar_testnet"));
}
}
// Keep up to date with client
setNumConnections(clientModel->getNumConnections());
connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
setNumBlocks(clientModel->getNumBlocks());
connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
// Report errors from network/worker thread
connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
}
// Keep up to date with client
setNumConnections(clientModel->getNumConnections());
connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
setNumBlocks(clientModel->getNumBlocks());
connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
// Report errors from network/worker thread
connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
}
void BitcoinGUI::setWalletModel(WalletModel *walletModel)
{
this->walletModel = walletModel;
if(walletModel)
{
// Report errors from wallet thread
connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
// Report errors from wallet thread
connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
// Put transaction list in tabs
transactionView->setModel(walletModel);
// Put transaction list in tabs
transactionView->setModel(walletModel);
overviewPage->setModel(walletModel);
addressBookPage->setModel(walletModel->getAddressTableModel());
receiveCoinsPage->setModel(walletModel->getAddressTableModel());
sendCoinsPage->setModel(walletModel);
overviewPage->setModel(walletModel);
addressBookPage->setModel(walletModel->getAddressTableModel());
receiveCoinsPage->setModel(walletModel->getAddressTableModel());
sendCoinsPage->setModel(walletModel);
setEncryptionStatus(walletModel->getEncryptionStatus());
connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
setEncryptionStatus(walletModel->getEncryptionStatus());
connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
// Balloon popup for new transaction
connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(incomingTransaction(QModelIndex,int,int)));
// Balloon popup for new transaction
connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(incomingTransaction(QModelIndex,int,int)));
// Ask for passphrase if needed
connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
// Ask for passphrase if needed
connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
}
}
void BitcoinGUI::createTrayIcon()
@@ -369,6 +373,8 @@ void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
void BitcoinGUI::optionsClicked()
{
if(!clientModel || !clientModel->getOptionsModel())
return;
OptionsDialog dlg;
dlg.setModel(clientModel->getOptionsModel());
dlg.exec();
@@ -398,6 +404,8 @@ void BitcoinGUI::setNumConnections(int count)
void BitcoinGUI::setNumBlocks(int count)
{
if(!clientModel)
return;
int initTotal = clientModel->getNumBlocksAtStartup();
int total = clientModel->getNumBlocksOfPeers();
QString tooltip;
@@ -470,11 +478,11 @@ void BitcoinGUI::error(const QString &title, const QString &message)
void BitcoinGUI::changeEvent(QEvent *e)
{
#ifndef Q_WS_MAC // Ignored on Mac
if (e->type() == QEvent::WindowStateChange)
if(e->type() == QEvent::WindowStateChange)
{
if (clientModel->getOptionsModel()->getMinimizeToTray())
if(clientModel && clientModel->getOptionsModel()->getMinimizeToTray())
{
if (isMinimized())
if(isMinimized())
{
hide();
e->ignore();
@@ -492,13 +500,16 @@ void BitcoinGUI::changeEvent(QEvent *e)
void BitcoinGUI::closeEvent(QCloseEvent *event)
{
#ifndef Q_WS_MAC // Ignored on Mac
if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
!clientModel->getOptionsModel()->getMinimizeOnClose())
if(clientModel)
{
qApp->quit();
}
#ifndef Q_WS_MAC // Ignored on Mac
if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
!clientModel->getOptionsModel()->getMinimizeOnClose())
{
qApp->quit();
}
#endif
}
QMainWindow::closeEvent(event);
}
@@ -517,6 +528,8 @@ void BitcoinGUI::askFee(qint64 nFeeRequired, bool *payFee)
void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int end)
{
if(!walletModel || !clientModel)
return;
TransactionTableModel *ttm = walletModel->getTransactionTableModel();
qint64 amount = ttm->index(start, TransactionTableModel::Amount, parent)
.data(Qt::EditRole).toULongLong();
@@ -654,6 +667,8 @@ void BitcoinGUI::setEncryptionStatus(int status)
void BitcoinGUI::encryptWallet(bool status)
{
if(!walletModel)
return;
AskPassphraseDialog dlg(status ? AskPassphraseDialog::Encrypt:
AskPassphraseDialog::Decrypt, this);
dlg.setModel(walletModel);
@@ -671,6 +686,8 @@ void BitcoinGUI::changePassphrase()
void BitcoinGUI::unlockWallet()
{
if(!walletModel)
return;
// Unlock wallet when requested by wallet model
if(walletModel->getEncryptionStatus() == WalletModel::Locked)
{

View File

@@ -48,7 +48,11 @@ bool CSVModelWriter::write()
return false;
QTextStream out(&file);
int numRows = model->rowCount();
int numRows = 0;
if(model)
{
numRows = model->rowCount();
}
// Header row
for(int i=0; i<columns.size(); ++i)

View File

@@ -56,6 +56,8 @@ void EditAddressDialog::loadRow(int row)
bool EditAddressDialog::saveCurrentRow()
{
if(!model)
return false;
switch(mode)
{
case NewReceivingAddress:
@@ -78,6 +80,8 @@ bool EditAddressDialog::saveCurrentRow()
void EditAddressDialog::accept()
{
if(!model)
return;
if(!saveCurrentRow())
{
switch(model->getEditStatus())
@@ -113,3 +117,9 @@ QString EditAddressDialog::getAddress() const
{
return address;
}
void EditAddressDialog::setAddress(const QString &address)
{
this->address = address;
ui->addressEdit->setText(address);
}

View File

@@ -33,6 +33,7 @@ public:
void accept();
QString getAddress() const;
void setAddress(const QString &address);
private:
bool saveCurrentRow();

2333
src/qt/locale/bitcoin_da.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="es_CL" version="2.0">
<defaultcodec>UTF-8</defaultcodec>
<context>
<name>AboutDialog</name>
<message>
@@ -11,7 +12,7 @@
<source>&lt;b&gt;Bitcoin&lt;/b&gt; version</source>
<translation>&lt;b&gt;Bitcoin&lt;/b&gt; - versión </translation>
</message>
<message utf8="true">
<message>
<location filename="../forms/aboutdialog.ui" line="85"/>
<source>Copyright © 2009-2011 Bitcoin Developers
@@ -80,22 +81,22 @@ Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard.</tran
<translation>&amp;Borrar</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="197"/>
<location filename="../addressbookpage.cpp" line="204"/>
<source>Export Address Book Data</source>
<translation>Exporta datos de la guia de direcciones</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="199"/>
<location filename="../addressbookpage.cpp" line="206"/>
<source>Comma separated file (*.csv)</source>
<translation>Archivos separados por coma (*.csv)</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="212"/>
<location filename="../addressbookpage.cpp" line="219"/>
<source>Error exporting</source>
<translation>Exportar errores</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="212"/>
<location filename="../addressbookpage.cpp" line="219"/>
<source>Could not write to file %1.</source>
<translation>No se pudo escribir al archivo %1.</translation>
</message>
@@ -253,99 +254,74 @@ Are you sure you wish to encrypt your wallet?</source>
<context>
<name>BitcoinGUI</name>
<message>
<location filename="../bitcoingui.cpp" line="59"/>
<location filename="../bitcoingui.cpp" line="63"/>
<source>Bitcoin Wallet</source>
<translation>Billetera Bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="67"/>
<source>&amp;File</source>
<translation>&amp;Archivo</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="73"/>
<source>&amp;Settings</source>
<translation>&amp;Configuración</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="79"/>
<source>&amp;Help</source>
<translation>&amp;Ayuda</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="83"/>
<source>Tabs toolbar</source>
<translation>Barra de pestañas</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="91"/>
<source>Actions toolbar</source>
<translation>Barra de acciónes</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="142"/>
<location filename="../bitcoingui.cpp" line="132"/>
<source>Synchronizing with network...</source>
<translation>Sincronizando con la red...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="145"/>
<location filename="../bitcoingui.cpp" line="135"/>
<source>Block chain synchronization in progress</source>
<translation>Sincronización de la cadena de bloques en progreso</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="169"/>
<location filename="../bitcoingui.cpp" line="164"/>
<source>&amp;Overview</source>
<translation>&amp;Vista general</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="170"/>
<location filename="../bitcoingui.cpp" line="165"/>
<source>Show general overview of wallet</source>
<translation>Muestra una vista general de la billetera</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="174"/>
<location filename="../bitcoingui.cpp" line="170"/>
<source>&amp;Transactions</source>
<translation>&amp;Transacciónes</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="175"/>
<location filename="../bitcoingui.cpp" line="171"/>
<source>Browse transaction history</source>
<translation>Explora el historial de transacciónes</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="179"/>
<location filename="../bitcoingui.cpp" line="176"/>
<source>&amp;Address Book</source>
<translation>&amp;Guia de direcciónes</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="180"/>
<location filename="../bitcoingui.cpp" line="177"/>
<source>Edit the list of stored addresses and labels</source>
<translation>Edita la lista de direcciones y etiquetas almacenadas</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="184"/>
<location filename="../bitcoingui.cpp" line="182"/>
<source>&amp;Receive coins</source>
<translation>&amp;Recibir monedas</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="185"/>
<location filename="../bitcoingui.cpp" line="183"/>
<source>Show the list of addresses for receiving payments</source>
<translation>Muestra la lista de direcciónes utilizadas para recibir pagos</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="189"/>
<location filename="../bitcoingui.cpp" line="188"/>
<source>&amp;Send coins</source>
<translation>&amp;Envíar monedas</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="190"/>
<location filename="../bitcoingui.cpp" line="189"/>
<source>Send coins to a bitcoin address</source>
<translation>Enviar monedas a una dirección bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="200"/>
<source>&amp;Exit</source>
<translation>&amp;Salir</translation>
<source>E&amp;xit</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../bitcoingui.cpp" line="201"/>
@@ -353,147 +329,172 @@ Are you sure you wish to encrypt your wallet?</source>
<translation>Salir del programa</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="202"/>
<source>&amp;About</source>
<translation>&amp;Acerca de</translation>
<location filename="../bitcoingui.cpp" line="204"/>
<source>&amp;About %1</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../bitcoingui.cpp" line="203"/>
<location filename="../bitcoingui.cpp" line="205"/>
<source>Show information about Bitcoin</source>
<translation>Muestra información acerca de Bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="204"/>
<location filename="../bitcoingui.cpp" line="207"/>
<source>&amp;Options...</source>
<translation>&amp;Opciones</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="205"/>
<location filename="../bitcoingui.cpp" line="208"/>
<source>Modify configuration options for bitcoin</source>
<translation>Modifica las opciones de configuración de bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="206"/>
<location filename="../bitcoingui.cpp" line="210"/>
<source>Open &amp;Bitcoin</source>
<translation>Abre &amp;Bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="207"/>
<location filename="../bitcoingui.cpp" line="211"/>
<source>Show the Bitcoin window</source>
<translation>Muestra la ventana de Bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="208"/>
<location filename="../bitcoingui.cpp" line="212"/>
<source>&amp;Export...</source>
<translation>&amp;Exportar...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="209"/>
<location filename="../bitcoingui.cpp" line="213"/>
<source>Export the current view to a file</source>
<translation>Exportar la vista actual a un archivo</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="210"/>
<location filename="../bitcoingui.cpp" line="214"/>
<source>&amp;Encrypt Wallet</source>
<translation>&amp;Codificar la billetera</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="211"/>
<location filename="../bitcoingui.cpp" line="215"/>
<source>Encrypt or decrypt wallet</source>
<translation>Codificar o decodificar la billetera</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="213"/>
<location filename="../bitcoingui.cpp" line="217"/>
<source>&amp;Change Passphrase</source>
<translation>&amp;Cambiar la contraseña</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="214"/>
<location filename="../bitcoingui.cpp" line="218"/>
<source>Change the passphrase used for wallet encryption</source>
<translation>Cambiar la contraseña utilizada para la codificación de la billetera</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="230"/>
<location filename="../bitcoingui.cpp" line="239"/>
<source>&amp;File</source>
<translation>&amp;Archivo</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="242"/>
<source>&amp;Settings</source>
<translation>&amp;Configuración</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="248"/>
<source>&amp;Help</source>
<translation>&amp;Ayuda</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="254"/>
<source>Tabs toolbar</source>
<translation>Barra de pestañas</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="262"/>
<source>Actions toolbar</source>
<translation>Barra de acciónes</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="273"/>
<source>[testnet]</source>
<translation>[red-de-pruebas]</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="293"/>
<location filename="../bitcoingui.cpp" line="355"/>
<source>bitcoin-qt</source>
<translation>bitcoin-qt</translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="332"/>
<location filename="../bitcoingui.cpp" line="396"/>
<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>
<location filename="../bitcoingui.cpp" line="347"/>
<location filename="../bitcoingui.cpp" line="411"/>
<source>Downloaded %1 of %2 blocks of transaction history.</source>
<translation>Descargados %1 de %2 bloques del historial de transacciones.</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="353"/>
<location filename="../bitcoingui.cpp" line="417"/>
<source>Downloaded %1 blocks of transaction history.</source>
<translation>Descargado %1 bloques del historial de transacciones.</translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="364"/>
<location filename="../bitcoingui.cpp" line="428"/>
<source>%n second(s) ago</source>
<translation><numerusform>Hace %n segundo</numerusform><numerusform>Hace %n segundos</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="368"/>
<location filename="../bitcoingui.cpp" line="432"/>
<source>%n minute(s) ago</source>
<translation><numerusform>Hace %n minuto</numerusform><numerusform>Hace %n minutos</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="372"/>
<location filename="../bitcoingui.cpp" line="436"/>
<source>%n hour(s) ago</source>
<translation><numerusform>Hace %n hora</numerusform><numerusform>Hace %n horas</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="376"/>
<location filename="../bitcoingui.cpp" line="440"/>
<source>%n day(s) ago</source>
<translation><numerusform>Hace %n día</numerusform><numerusform>Hace %n días</numerusform></translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="382"/>
<location filename="../bitcoingui.cpp" line="446"/>
<source>Up to date</source>
<translation>Actualizado</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="387"/>
<location filename="../bitcoingui.cpp" line="451"/>
<source>Catching up...</source>
<translation>Recuperando...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="393"/>
<location filename="../bitcoingui.cpp" line="457"/>
<source>Last received block was generated %1.</source>
<translation>El ultimo bloque recibido fue generado %1.</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="440"/>
<location filename="../bitcoingui.cpp" line="508"/>
<source>This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?</source>
<translation>Esta transacción supera el límite. Puedes seguir enviandola incluyendo una comisión de %s que se va a repartir entre los nodos que procesan su transacción y ayudan a mantener la red. ¿Quieres seguir con la transacción?</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="445"/>
<location filename="../bitcoingui.cpp" line="513"/>
<source>Sending...</source>
<translation>Enviando...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="470"/>
<location filename="../bitcoingui.cpp" line="538"/>
<source>Sent transaction</source>
<translation>Transacción enviada</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="471"/>
<location filename="../bitcoingui.cpp" line="539"/>
<source>Incoming transaction</source>
<translation>Transacción entrante</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="472"/>
<location filename="../bitcoingui.cpp" line="540"/>
<source>Date: %1
Amount: %2
Type: %3
@@ -505,12 +506,12 @@ Tipo: %3
Dirección: %4</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="566"/>
<location filename="../bitcoingui.cpp" line="639"/>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>La billetera esta &lt;b&gt;codificada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&lt;/b&gt;</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="574"/>
<location filename="../bitcoingui.cpp" line="647"/>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
<translation>La billetera esta &lt;b&gt;codificada&lt;/b&gt; y actualmente &lt;b&gt;bloqueda&lt;/b&gt;</translation>
</message>
@@ -518,17 +519,17 @@ Dirección: %4</translation>
<context>
<name>DisplayOptionsPage</name>
<message>
<location filename="../optionsdialog.cpp" line="258"/>
<location filename="../optionsdialog.cpp" line="270"/>
<source>&amp;Unit to show amounts in: </source>
<translation>&amp;Unidad en la que mostrar cantitades: </translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="262"/>
<location filename="../optionsdialog.cpp" line="274"/>
<source>Choose the default subdivision unit to show in the interface, and when sending coins</source>
<translation>Elige la subdivisión por defecto para mostrar cantidaded en la interfaz cuando se envien monedas</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="269"/>
<location filename="../optionsdialog.cpp" line="281"/>
<source>Display addresses in transaction list</source>
<translation>Muestra direcciones en el listado de transaccioines</translation>
</message>
@@ -604,87 +605,87 @@ Dirección: %4</translation>
<context>
<name>MainOptionsPage</name>
<message>
<location filename="../optionsdialog.cpp" line="166"/>
<location filename="../optionsdialog.cpp" line="170"/>
<source>&amp;Start Bitcoin on window system startup</source>
<translation>&amp;Inicia Bitcoin al iniciar el sistema</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="167"/>
<location filename="../optionsdialog.cpp" line="171"/>
<source>Automatically start Bitcoin after the computer is turned on</source>
<translation>Inicia Bitcoin automáticamente despues de encender el computador</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="170"/>
<location filename="../optionsdialog.cpp" line="175"/>
<source>&amp;Minimize to the tray instead of the taskbar</source>
<translation>&amp;Minimiza a la bandeja en vez de la barra de tareas</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="171"/>
<location filename="../optionsdialog.cpp" line="176"/>
<source>Show only a tray icon after minimizing the window</source>
<translation>Muestra solo un ícono en la bandeja después de minimizar la ventana</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="174"/>
<location filename="../optionsdialog.cpp" line="180"/>
<source>Map port using &amp;UPnP</source>
<translation>Direcciona el puerto usando &amp;UPnP</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="175"/>
<location filename="../optionsdialog.cpp" line="181"/>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>Abre automáticamente el puerto del cliente Bitcoin en el router. Esto funciona solo cuando tu router es compatible con UPnP y está habilitado.</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="178"/>
<location filename="../optionsdialog.cpp" line="185"/>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimiza a la bandeja al cerrar</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="179"/>
<location filename="../optionsdialog.cpp" line="186"/>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
<translation>Minimiza la ventana en lugar de salir del programa cuando la ventana se cierra. Cuando esta opción esta activa el programa solo se puede cerrar seleccionando Salir desde el menu.</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="182"/>
<location filename="../optionsdialog.cpp" line="190"/>
<source>&amp;Connect through SOCKS4 proxy:</source>
<translation>&amp;Conecta a traves de un proxy SOCKS4:</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="183"/>
<location filename="../optionsdialog.cpp" line="191"/>
<source>Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor)</source>
<translation>Conecta a la red Bitcoin a través de un proxy SOCKS4 (ej. cuando te conectas por la red Tor)</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="188"/>
<location filename="../optionsdialog.cpp" line="196"/>
<source>Proxy &amp;IP: </source>
<translation>&amp;IP Proxy:</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="194"/>
<location filename="../optionsdialog.cpp" line="202"/>
<source>IP address of the proxy (e.g. 127.0.0.1)</source>
<translation>Dirección IP del servidor proxy (ej. 127.0.0.1)</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="197"/>
<location filename="../optionsdialog.cpp" line="205"/>
<source>&amp;Port: </source>
<translation>&amp;Puerto:</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="203"/>
<location filename="../optionsdialog.cpp" line="211"/>
<source>Port of the proxy (e.g. 1234)</source>
<translation>Puerto del servidor proxy (ej. 1234)</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="209"/>
<location filename="../optionsdialog.cpp" line="217"/>
<source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
<translation>Comisión de operación opcional por KB que ayuda a asegurar que tus transacciones sean procesadas rápidamente. La mayoría de las transacciones son de 1KB. Se recomienda una comisión de 0.01.</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="215"/>
<location filename="../optionsdialog.cpp" line="223"/>
<source>Pay transaction &amp;fee</source>
<translation>Comision de &amp;transacciónes</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="218"/>
<location filename="../optionsdialog.cpp" line="226"/>
<source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
<translation>Comisión de operación opcional por KB que ayuda a asegurar que tus transacciones sean procesadas rápidamente. La mayoría de las transacciones son de 1KB. Se recomienda una comisión de 0.01.</translation>
</message>
@@ -692,17 +693,17 @@ Dirección: %4</translation>
<context>
<name>OptionsDialog</name>
<message>
<location filename="../optionsdialog.cpp" line="75"/>
<location filename="../optionsdialog.cpp" line="79"/>
<source>Main</source>
<translation>Principal</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="80"/>
<location filename="../optionsdialog.cpp" line="84"/>
<source>Display</source>
<translation>Mostrado</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="100"/>
<location filename="../optionsdialog.cpp" line="104"/>
<source>Options</source>
<translation>Opciones</translation>
</message>
@@ -782,103 +783,103 @@ p, li { white-space: pre-wrap; }
<name>SendCoinsDialog</name>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="14"/>
<location filename="../sendcoinsdialog.cpp" line="103"/>
<location filename="../sendcoinsdialog.cpp" line="108"/>
<location filename="../sendcoinsdialog.cpp" line="113"/>
<location filename="../sendcoinsdialog.cpp" line="118"/>
<location filename="../sendcoinsdialog.cpp" line="109"/>
<location filename="../sendcoinsdialog.cpp" line="114"/>
<location filename="../sendcoinsdialog.cpp" line="119"/>
<location filename="../sendcoinsdialog.cpp" line="124"/>
<location filename="../sendcoinsdialog.cpp" line="129"/>
<location filename="../sendcoinsdialog.cpp" line="134"/>
<location filename="../sendcoinsdialog.cpp" line="130"/>
<location filename="../sendcoinsdialog.cpp" line="135"/>
<location filename="../sendcoinsdialog.cpp" line="140"/>
<source>Send Coins</source>
<translation>Enviar monedas</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="67"/>
<location filename="../forms/sendcoinsdialog.ui" line="64"/>
<source>Send to multiple recipients at once</source>
<translation>Enviar a múltiples destinatarios</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="70"/>
<location filename="../forms/sendcoinsdialog.ui" line="67"/>
<source>&amp;Add recipient...</source>
<translation>&amp;Agrega destinatario...</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="87"/>
<location filename="../forms/sendcoinsdialog.ui" line="84"/>
<source>Clear all</source>
<translation>&amp;Borra todos</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="106"/>
<location filename="../forms/sendcoinsdialog.ui" line="103"/>
<source>Balance:</source>
<translation>Balance:</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="113"/>
<location filename="../forms/sendcoinsdialog.ui" line="110"/>
<source>123.456 BTC</source>
<translation>123.456 BTC</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="144"/>
<location filename="../forms/sendcoinsdialog.ui" line="141"/>
<source>Confirm the send action</source>
<translation>Confirma el envio</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="147"/>
<location filename="../forms/sendcoinsdialog.ui" line="144"/>
<source>&amp;Send</source>
<translation>&amp;Envía</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="79"/>
<location filename="../sendcoinsdialog.cpp" line="85"/>
<source>&lt;b&gt;%1&lt;/b&gt; to %2 (%3)</source>
<translation>&lt;b&gt;%1&lt;/b&gt; to %2 (%3)</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="82"/>
<location filename="../sendcoinsdialog.cpp" line="88"/>
<source>Confirm send coins</source>
<translation>Confirmar el envio de monedas</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="83"/>
<location filename="../sendcoinsdialog.cpp" line="89"/>
<source>Are you sure you want to send %1?</source>
<translation>Estas seguro que quieres enviar %1?</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="83"/>
<location filename="../sendcoinsdialog.cpp" line="89"/>
<source> and </source>
<translation>y</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="104"/>
<location filename="../sendcoinsdialog.cpp" line="110"/>
<source>The recepient address is not valid, please recheck.</source>
<translation>La dirección de destinatarion no es valida, comprueba otra vez.</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="109"/>
<location filename="../sendcoinsdialog.cpp" line="115"/>
<source>The amount to pay must be larger than 0.</source>
<translation>La cantidad por pagar tiene que ser mayor 0.</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="114"/>
<location filename="../sendcoinsdialog.cpp" line="120"/>
<source>Amount exceeds your balance</source>
<translation>La cantidad sobrepasa tu saldo</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="119"/>
<location filename="../sendcoinsdialog.cpp" line="125"/>
<source>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>
<location filename="../sendcoinsdialog.cpp" line="125"/>
<location filename="../sendcoinsdialog.cpp" line="131"/>
<source>Duplicate address found, can only send to each address once in one send operation</source>
<translation>Tienes una dirección duplicada, solo puedes enviar a direcciónes individuales de una sola vez</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="130"/>
<location filename="../sendcoinsdialog.cpp" line="136"/>
<source>Error: Transaction creation failed </source>
<translation>Error: La transacción no se pudo crear </translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="135"/>
<location filename="../sendcoinsdialog.cpp" line="141"/>
<source>Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
<translation>Error: La transacció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>
@@ -902,7 +903,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="66"/>
<location filename="../sendcoinsentry.cpp" line="22"/>
<location filename="../sendcoinsentry.cpp" line="26"/>
<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>
@@ -927,22 +928,22 @@ p, li { white-space: pre-wrap; }
<translation>Alt+A</translation>
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="126"/>
<location filename="../forms/sendcoinsentry.ui" line="120"/>
<source>Paste address from clipboard</source>
<translation>Pega dirección desde portapapeles</translation>
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="136"/>
<location filename="../forms/sendcoinsentry.ui" line="130"/>
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="146"/>
<location filename="../forms/sendcoinsentry.ui" line="137"/>
<source>Remove this recipient</source>
<translation>Elimina destinatario</translation>
</message>
<message>
<location filename="../sendcoinsentry.cpp" line="21"/>
<location filename="../sendcoinsentry.cpp" line="25"/>
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
<translation>Introduce una dirección Bitcoin (ej. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
</message>
@@ -1222,158 +1223,158 @@ p, li { white-space: pre-wrap; }
<context>
<name>TransactionView</name>
<message>
<location filename="../transactionview.cpp" line="48"/>
<location filename="../transactionview.cpp" line="61"/>
<location filename="../transactionview.cpp" line="55"/>
<location filename="../transactionview.cpp" line="71"/>
<source>All</source>
<translation>Todo</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="49"/>
<location filename="../transactionview.cpp" line="56"/>
<source>Today</source>
<translation>Hoy</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="50"/>
<location filename="../transactionview.cpp" line="57"/>
<source>This week</source>
<translation>Esta semana</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="51"/>
<location filename="../transactionview.cpp" line="58"/>
<source>This month</source>
<translation>Esta mes</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="52"/>
<location filename="../transactionview.cpp" line="59"/>
<source>Last month</source>
<translation>Mes pasado</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="53"/>
<location filename="../transactionview.cpp" line="60"/>
<source>This year</source>
<translation>Este año</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="54"/>
<location filename="../transactionview.cpp" line="61"/>
<source>Range...</source>
<translation>Rango...</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="62"/>
<location filename="../transactionview.cpp" line="72"/>
<source>Received with</source>
<translation>Recibido con</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="64"/>
<location filename="../transactionview.cpp" line="74"/>
<source>Sent to</source>
<translation>Enviado a</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="66"/>
<location filename="../transactionview.cpp" line="76"/>
<source>To yourself</source>
<translation>A ti mismo</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="67"/>
<location filename="../transactionview.cpp" line="77"/>
<source>Mined</source>
<translation>Minado</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="68"/>
<location filename="../transactionview.cpp" line="78"/>
<source>Other</source>
<translation>Otra</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="74"/>
<location filename="../transactionview.cpp" line="84"/>
<source>Enter address or label to search</source>
<translation>Introduce una dirección o etiqueta para buscar</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="80"/>
<location filename="../transactionview.cpp" line="90"/>
<source>Min amount</source>
<translation>Cantidad minima</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="108"/>
<location filename="../transactionview.cpp" line="125"/>
<source>Copy address</source>
<translation>Copia dirección</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="109"/>
<location filename="../transactionview.cpp" line="126"/>
<source>Copy label</source>
<translation>Copia etiqueta</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="110"/>
<location filename="../transactionview.cpp" line="127"/>
<source>Edit label</source>
<translation>Edita etiqueta</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="111"/>
<location filename="../transactionview.cpp" line="128"/>
<source>Show details...</source>
<translation>Muestra detalles...</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="244"/>
<location filename="../transactionview.cpp" line="261"/>
<source>Export Transaction Data</source>
<translation>Exportar datos de transacción</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="246"/>
<location filename="../transactionview.cpp" line="263"/>
<source>Comma separated file (*.csv)</source>
<translation>Archivos separados por coma (*.csv)</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="254"/>
<location filename="../transactionview.cpp" line="271"/>
<source>Confirmed</source>
<translation>Confirmado</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="255"/>
<location filename="../transactionview.cpp" line="272"/>
<source>Date</source>
<translation>Fecha</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="256"/>
<location filename="../transactionview.cpp" line="273"/>
<source>Type</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="257"/>
<location filename="../transactionview.cpp" line="274"/>
<source>Label</source>
<translation>Etiqueta</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="258"/>
<location filename="../transactionview.cpp" line="275"/>
<source>Address</source>
<translation>Dirección</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="259"/>
<location filename="../transactionview.cpp" line="276"/>
<source>Amount</source>
<translation>Cantidad</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="260"/>
<location filename="../transactionview.cpp" line="277"/>
<source>ID</source>
<translation>ID</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="264"/>
<location filename="../transactionview.cpp" line="281"/>
<source>Error exporting</source>
<translation>Error exportando</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="264"/>
<location filename="../transactionview.cpp" line="281"/>
<source>Could not write to file %1.</source>
<translation>No se pudo escribir en el archivo %1.</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="352"/>
<location filename="../transactionview.cpp" line="369"/>
<source>Range:</source>
<translation>Rango:</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="360"/>
<location filename="../transactionview.cpp" line="377"/>
<source>to</source>
<translation>para</translation>
</message>
@@ -2330,4 +2331,12 @@ pero la información de los comentarios quedará en blanco.</translation>
<translation>beta</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../bitcoin.cpp" line="145"/>
<source>Bitcoin Qt</source>
<translation type="unfinished"/>
</message>
</context>
</TS>

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="nb" version="2.0">
<defaultcodec>UTF-8</defaultcodec>
<context>
<name>AboutDialog</name>
<message>
@@ -11,7 +12,7 @@
<source>&lt;b&gt;Bitcoin&lt;/b&gt; version</source>
<translation>&lt;b&gt;Bitcoin&lt;/b&gt; versjon</translation>
</message>
<message utf8="true">
<message>
<location filename="../forms/aboutdialog.ui" line="85"/>
<source>Copyright © 2009-2011 Bitcoin Developers
@@ -77,22 +78,22 @@ Dette produktet inneholder programvare utviklet av OpenSSL Prosjektet for bruk i
<translation>&amp;Slett</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="197"/>
<location filename="../addressbookpage.cpp" line="204"/>
<source>Export Address Book Data</source>
<translation>Eksporter adressebok</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="199"/>
<location filename="../addressbookpage.cpp" line="206"/>
<source>Comma separated file (*.csv)</source>
<translation>Kommaseparert fil (*.csv)</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="212"/>
<location filename="../addressbookpage.cpp" line="219"/>
<source>Error exporting</source>
<translation>Feil ved eksportering</translation>
</message>
<message>
<location filename="../addressbookpage.cpp" line="212"/>
<location filename="../addressbookpage.cpp" line="219"/>
<source>Could not write to file %1.</source>
<translation>Kunne ikke skrive til filen %1.</translation>
</message>
@@ -250,99 +251,74 @@ Er du sikker på at du vil kryptere lommeboken?</translation>
<context>
<name>BitcoinGUI</name>
<message>
<location filename="../bitcoingui.cpp" line="59"/>
<location filename="../bitcoingui.cpp" line="63"/>
<source>Bitcoin Wallet</source>
<translation>Bitcoin Lommebok</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="67"/>
<source>&amp;File</source>
<translation>&amp;Fil</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="73"/>
<source>&amp;Settings</source>
<translation>&amp;Innstillinger</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="79"/>
<source>&amp;Help</source>
<translation>&amp;Hjelp</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="83"/>
<source>Tabs toolbar</source>
<translation>Verktøylinje for faner</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="91"/>
<source>Actions toolbar</source>
<translation>Verktøylinje for handlinger</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="142"/>
<location filename="../bitcoingui.cpp" line="132"/>
<source>Synchronizing with network...</source>
<translation>Synkroniserer med nettverk...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="145"/>
<location filename="../bitcoingui.cpp" line="135"/>
<source>Block chain synchronization in progress</source>
<translation>Synkronisering av blokk-kjede igang</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="169"/>
<location filename="../bitcoingui.cpp" line="164"/>
<source>&amp;Overview</source>
<translation>&amp;Oversikt</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="170"/>
<location filename="../bitcoingui.cpp" line="165"/>
<source>Show general overview of wallet</source>
<translation>Vis generell oversikt over lommeboken</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="174"/>
<location filename="../bitcoingui.cpp" line="170"/>
<source>&amp;Transactions</source>
<translation>&amp;Transaksjoner</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="175"/>
<location filename="../bitcoingui.cpp" line="171"/>
<source>Browse transaction history</source>
<translation>Vis transaksjonshistorikk</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="179"/>
<location filename="../bitcoingui.cpp" line="176"/>
<source>&amp;Address Book</source>
<translation>&amp;Adressebok</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="180"/>
<location filename="../bitcoingui.cpp" line="177"/>
<source>Edit the list of stored addresses and labels</source>
<translation>Rediger listen over adresser og deres merkelapper</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="184"/>
<location filename="../bitcoingui.cpp" line="182"/>
<source>&amp;Receive coins</source>
<translation>&amp;Motta bitcoins</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="185"/>
<location filename="../bitcoingui.cpp" line="183"/>
<source>Show the list of addresses for receiving payments</source>
<translation>Vis listen over adresser for mottak av betalinger</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="189"/>
<location filename="../bitcoingui.cpp" line="188"/>
<source>&amp;Send coins</source>
<translation>&amp;Send bitcoins</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="190"/>
<location filename="../bitcoingui.cpp" line="189"/>
<source>Send coins to a bitcoin address</source>
<translation>Send bitcoins til en adresse</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="200"/>
<source>&amp;Exit</source>
<translation>&amp;Avslutt</translation>
<source>E&amp;xit</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../bitcoingui.cpp" line="201"/>
@@ -350,147 +326,172 @@ Er du sikker på at du vil kryptere lommeboken?</translation>
<translation>Avslutt applikasjonen</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="202"/>
<source>&amp;About</source>
<translation>&amp;Om</translation>
<location filename="../bitcoingui.cpp" line="204"/>
<source>&amp;About %1</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../bitcoingui.cpp" line="203"/>
<location filename="../bitcoingui.cpp" line="205"/>
<source>Show information about Bitcoin</source>
<translation>Vis informasjon om Bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="204"/>
<location filename="../bitcoingui.cpp" line="207"/>
<source>&amp;Options...</source>
<translation>&amp;Innstillinger...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="205"/>
<location filename="../bitcoingui.cpp" line="208"/>
<source>Modify configuration options for bitcoin</source>
<translation>Endre innstillinger for bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="206"/>
<location filename="../bitcoingui.cpp" line="210"/>
<source>Open &amp;Bitcoin</source>
<translation>Åpne &amp;Bitcoin</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="207"/>
<location filename="../bitcoingui.cpp" line="211"/>
<source>Show the Bitcoin window</source>
<translation>Vis Bitcoin-vinduet</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="208"/>
<location filename="../bitcoingui.cpp" line="212"/>
<source>&amp;Export...</source>
<translation>&amp;Eksporter...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="209"/>
<location filename="../bitcoingui.cpp" line="213"/>
<source>Export the current view to a file</source>
<translation>Eksporter visningen til en fil</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="210"/>
<location filename="../bitcoingui.cpp" line="214"/>
<source>&amp;Encrypt Wallet</source>
<translation>&amp;Krypter Lommebok</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="211"/>
<location filename="../bitcoingui.cpp" line="215"/>
<source>Encrypt or decrypt wallet</source>
<translation>Krypter eller dekrypter lommebok</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="213"/>
<location filename="../bitcoingui.cpp" line="217"/>
<source>&amp;Change Passphrase</source>
<translation>&amp;Endre Adgangsfrase</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="214"/>
<location filename="../bitcoingui.cpp" line="218"/>
<source>Change the passphrase used for wallet encryption</source>
<translation>Endre adgangsfrasen brukt for kryptering av lommebok</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="230"/>
<location filename="../bitcoingui.cpp" line="239"/>
<source>&amp;File</source>
<translation>&amp;Fil</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="242"/>
<source>&amp;Settings</source>
<translation>&amp;Innstillinger</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="248"/>
<source>&amp;Help</source>
<translation>&amp;Hjelp</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="254"/>
<source>Tabs toolbar</source>
<translation>Verktøylinje for faner</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="262"/>
<source>Actions toolbar</source>
<translation>Verktøylinje for handlinger</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="273"/>
<source>[testnet]</source>
<translation>[testnett]</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="293"/>
<location filename="../bitcoingui.cpp" line="355"/>
<source>bitcoin-qt</source>
<translation>bitcoin-qt</translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="332"/>
<location filename="../bitcoingui.cpp" line="396"/>
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n aktiv forbindelse til Bitcoin nettverket</numerusform><numerusform>%n aktive forbindelser to Bitcoin nettverket</numerusform></translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="347"/>
<location filename="../bitcoingui.cpp" line="411"/>
<source>Downloaded %1 of %2 blocks of transaction history.</source>
<translation>Lastet ned %1 av %2 blokker med transaksjonshistorikk.</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="353"/>
<location filename="../bitcoingui.cpp" line="417"/>
<source>Downloaded %1 blocks of transaction history.</source>
<translation>Lastet ned %1 blokker med transaksjonshistorikk.</translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="364"/>
<location filename="../bitcoingui.cpp" line="428"/>
<source>%n second(s) ago</source>
<translation><numerusform>%n sekund igjen</numerusform><numerusform>%n sekunder igjen</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="368"/>
<location filename="../bitcoingui.cpp" line="432"/>
<source>%n minute(s) ago</source>
<translation><numerusform>%n minutt siden</numerusform><numerusform>%n minutter siden</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="372"/>
<location filename="../bitcoingui.cpp" line="436"/>
<source>%n hour(s) ago</source>
<translation><numerusform>%n time siden</numerusform><numerusform>%n timer siden</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../bitcoingui.cpp" line="376"/>
<location filename="../bitcoingui.cpp" line="440"/>
<source>%n day(s) ago</source>
<translation><numerusform>%n dag siden</numerusform><numerusform>%n dager siden</numerusform></translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="382"/>
<location filename="../bitcoingui.cpp" line="446"/>
<source>Up to date</source>
<translation>Ajour</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="387"/>
<location filename="../bitcoingui.cpp" line="451"/>
<source>Catching up...</source>
<translation>Kommer ajour...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="393"/>
<location filename="../bitcoingui.cpp" line="457"/>
<source>Last received block was generated %1.</source>
<translation>Siste mottatte blokk ble generert %1.</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="440"/>
<location filename="../bitcoingui.cpp" line="508"/>
<source>This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?</source>
<translation>Denne transaksjonen overstiger størrelsesbegrensningen. Du kan likevel sende den med et gebyr %1, som går til nodene som prosesserer transaksjonen din og støtter nettverket. Vil du betale gebyret?</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="445"/>
<location filename="../bitcoingui.cpp" line="513"/>
<source>Sending...</source>
<translation>Sender...</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="470"/>
<location filename="../bitcoingui.cpp" line="538"/>
<source>Sent transaction</source>
<translation>Sendt transaksjon</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="471"/>
<location filename="../bitcoingui.cpp" line="539"/>
<source>Incoming transaction</source>
<translation>Innkommende transaksjon</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="472"/>
<location filename="../bitcoingui.cpp" line="540"/>
<source>Date: %1
Amount: %2
Type: %3
@@ -503,12 +504,12 @@ Adresse: %4
</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="566"/>
<location filename="../bitcoingui.cpp" line="639"/>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Lommeboken er &lt;b&gt;kryptert&lt;/b&gt; og for tiden &lt;b&gt;ulåst&lt;/b&gt;</translation>
</message>
<message>
<location filename="../bitcoingui.cpp" line="574"/>
<location filename="../bitcoingui.cpp" line="647"/>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
<translation>Lommeboken er &lt;b&gt;kryptert&lt;/b&gt; og for tiden &lt;b&gt;låst&lt;/b&gt;</translation>
</message>
@@ -516,17 +517,17 @@ Adresse: %4
<context>
<name>DisplayOptionsPage</name>
<message>
<location filename="../optionsdialog.cpp" line="258"/>
<location filename="../optionsdialog.cpp" line="270"/>
<source>&amp;Unit to show amounts in: </source>
<translation>&amp;Enhet for å vise beløp i: </translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="262"/>
<location filename="../optionsdialog.cpp" line="274"/>
<source>Choose the default subdivision unit to show in the interface, and when sending coins</source>
<translation>Velg standard underenhet som skal vises i grensesnittet og ved sending av mynter</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="269"/>
<location filename="../optionsdialog.cpp" line="281"/>
<source>Display addresses in transaction list</source>
<translation>Vis adresser i transaksjonslisten</translation>
</message>
@@ -602,87 +603,87 @@ Adresse: %4
<context>
<name>MainOptionsPage</name>
<message>
<location filename="../optionsdialog.cpp" line="166"/>
<location filename="../optionsdialog.cpp" line="170"/>
<source>&amp;Start Bitcoin on window system startup</source>
<translation>&amp;Start Bitcoin ved oppstart</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="167"/>
<location filename="../optionsdialog.cpp" line="171"/>
<source>Automatically start Bitcoin after the computer is turned on</source>
<translation>Start Bitcoin automatisk når datamaskinen blir slått </translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="170"/>
<location filename="../optionsdialog.cpp" line="175"/>
<source>&amp;Minimize to the tray instead of the taskbar</source>
<translation>&amp;Minimer til systemkurv istedenfor oppgavelinjen</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="171"/>
<location filename="../optionsdialog.cpp" line="176"/>
<source>Show only a tray icon after minimizing the window</source>
<translation>Vis kun ikon i systemkurv etter minimering av vinduet</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="174"/>
<location filename="../optionsdialog.cpp" line="180"/>
<source>Map port using &amp;UPnP</source>
<translation>Sett opp port vha. &amp;UPnP</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="175"/>
<location filename="../optionsdialog.cpp" line="181"/>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>Åpne automatisk Bitcoin klientporten ruteren. Dette virker kun om din ruter støtter UPnP og dette er påslått.</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="178"/>
<location filename="../optionsdialog.cpp" line="185"/>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimér ved lukking</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="179"/>
<location filename="../optionsdialog.cpp" line="186"/>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
<translation>Minimerer vinduet istedenfor å avslutte applikasjonen når vinduet lukkes. Når dette er slått avsluttes applikasjonen kun ved å velge avslutt i menyen.</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="182"/>
<location filename="../optionsdialog.cpp" line="190"/>
<source>&amp;Connect through SOCKS4 proxy:</source>
<translation>&amp;Koble til gjennom SOCKS4 proxy:</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="183"/>
<location filename="../optionsdialog.cpp" line="191"/>
<source>Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor)</source>
<translation>Koble til Bitcoin nettverket gjennom en SOCKS4 mellomtjener (f.eks. for tilkobling gjennom Tor)</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="188"/>
<location filename="../optionsdialog.cpp" line="196"/>
<source>Proxy &amp;IP: </source>
<translation>Mellomtjeners &amp;IP: </translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="194"/>
<location filename="../optionsdialog.cpp" line="202"/>
<source>IP address of the proxy (e.g. 127.0.0.1)</source>
<translation>IP-adresse for mellomtjener (f.eks. 127.0.0.1)</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="197"/>
<location filename="../optionsdialog.cpp" line="205"/>
<source>&amp;Port: </source>
<translation>&amp;Port: </translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="203"/>
<location filename="../optionsdialog.cpp" line="211"/>
<source>Port of the proxy (e.g. 1234)</source>
<translation>Port for mellomtjener (f.eks. 1234)</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="209"/>
<location filename="../optionsdialog.cpp" line="217"/>
<source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
<translation>Valgfritt transaksjonsgebyr per KB som hjelper for å sikre at transaksjonene dine blir raskt prosessert. De fleste transaksjoner er 1KB. Et gebyr 0.01 anbefales.</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="215"/>
<location filename="../optionsdialog.cpp" line="223"/>
<source>Pay transaction &amp;fee</source>
<translation>Betal transaksjons&amp;gebyr</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="218"/>
<location filename="../optionsdialog.cpp" line="226"/>
<source>Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended.</source>
<translation>Valgfritt transaksjonsgebyr per KB som hjelper for å sikre at transaksjonene dine blir raskt prosessert. De fleste transaksjoner er 1KB. Et gebyr 0.01 anbefales.</translation>
</message>
@@ -690,17 +691,17 @@ Adresse: %4
<context>
<name>OptionsDialog</name>
<message>
<location filename="../optionsdialog.cpp" line="75"/>
<location filename="../optionsdialog.cpp" line="79"/>
<source>Main</source>
<translation>Hoved</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="80"/>
<location filename="../optionsdialog.cpp" line="84"/>
<source>Display</source>
<translation>Visning</translation>
</message>
<message>
<location filename="../optionsdialog.cpp" line="100"/>
<location filename="../optionsdialog.cpp" line="104"/>
<source>Options</source>
<translation>Innstillinger</translation>
</message>
@@ -780,103 +781,103 @@ p, li { white-space: pre-wrap; }
<name>SendCoinsDialog</name>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="14"/>
<location filename="../sendcoinsdialog.cpp" line="103"/>
<location filename="../sendcoinsdialog.cpp" line="108"/>
<location filename="../sendcoinsdialog.cpp" line="113"/>
<location filename="../sendcoinsdialog.cpp" line="118"/>
<location filename="../sendcoinsdialog.cpp" line="109"/>
<location filename="../sendcoinsdialog.cpp" line="114"/>
<location filename="../sendcoinsdialog.cpp" line="119"/>
<location filename="../sendcoinsdialog.cpp" line="124"/>
<location filename="../sendcoinsdialog.cpp" line="129"/>
<location filename="../sendcoinsdialog.cpp" line="134"/>
<location filename="../sendcoinsdialog.cpp" line="130"/>
<location filename="../sendcoinsdialog.cpp" line="135"/>
<location filename="../sendcoinsdialog.cpp" line="140"/>
<source>Send Coins</source>
<translation>Send Bitcoins</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="67"/>
<location filename="../forms/sendcoinsdialog.ui" line="64"/>
<source>Send to multiple recipients at once</source>
<translation>Send til flere enn én mottaker</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="70"/>
<location filename="../forms/sendcoinsdialog.ui" line="67"/>
<source>&amp;Add recipient...</source>
<translation>&amp;Legg til mottaker...</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="87"/>
<location filename="../forms/sendcoinsdialog.ui" line="84"/>
<source>Clear all</source>
<translation>Fjern alle</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="106"/>
<location filename="../forms/sendcoinsdialog.ui" line="103"/>
<source>Balance:</source>
<translation>Saldo:</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="113"/>
<location filename="../forms/sendcoinsdialog.ui" line="110"/>
<source>123.456 BTC</source>
<translation>123.456 BTC</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="144"/>
<location filename="../forms/sendcoinsdialog.ui" line="141"/>
<source>Confirm the send action</source>
<translation>Bekreft sending</translation>
</message>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="147"/>
<location filename="../forms/sendcoinsdialog.ui" line="144"/>
<source>&amp;Send</source>
<translation>&amp;Send</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="79"/>
<location filename="../sendcoinsdialog.cpp" line="85"/>
<source>&lt;b&gt;%1&lt;/b&gt; to %2 (%3)</source>
<translation>&lt;b&gt;%1&lt;/b&gt; til %2 (%3)</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="82"/>
<location filename="../sendcoinsdialog.cpp" line="88"/>
<source>Confirm send coins</source>
<translation>Bekreft sending av bitcoins</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="83"/>
<location filename="../sendcoinsdialog.cpp" line="89"/>
<source>Are you sure you want to send %1?</source>
<translation>Er du sikker at du vil sende %1?</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="83"/>
<location filename="../sendcoinsdialog.cpp" line="89"/>
<source> and </source>
<translation> og </translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="104"/>
<location filename="../sendcoinsdialog.cpp" line="110"/>
<source>The recepient address is not valid, please recheck.</source>
<translation>Mottaksadressen er ugyldig, prøv igjen.</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="109"/>
<location filename="../sendcoinsdialog.cpp" line="115"/>
<source>The amount to pay must be larger than 0.</source>
<translation>Beløpen som skal betales være over 0.</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="114"/>
<location filename="../sendcoinsdialog.cpp" line="120"/>
<source>Amount exceeds your balance</source>
<translation>Beløpet overstiger saldoen din</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="119"/>
<location filename="../sendcoinsdialog.cpp" line="125"/>
<source>Total exceeds your balance when the %1 transaction fee is included</source>
<translation>Totalen overgår din saldo når transaksjonsgebyret %1 tas med</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="125"/>
<location filename="../sendcoinsdialog.cpp" line="131"/>
<source>Duplicate address found, can only send to each address once in one send operation</source>
<translation>Duplikate adresser funnet, kan kun sende til hver adresse en gang i hver sendeoperasjon</translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="130"/>
<location filename="../sendcoinsdialog.cpp" line="136"/>
<source>Error: Transaction creation failed </source>
<translation>Feil: Opprettelse av transaksjon feilet </translation>
</message>
<message>
<location filename="../sendcoinsdialog.cpp" line="135"/>
<location filename="../sendcoinsdialog.cpp" line="141"/>
<source>Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
<translation>Feil: Transaksjonen ble avvist. Dette kan skje hvis noen av myntene i lommeboken allerede var brukt, f.eks. hvis du kopierte wallet.dat og mynter ble brukt i kopien uten å bli markert brukt her.</translation>
</message>
@@ -900,7 +901,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="66"/>
<location filename="../sendcoinsentry.cpp" line="22"/>
<location filename="../sendcoinsentry.cpp" line="26"/>
<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>
@@ -925,22 +926,22 @@ p, li { white-space: pre-wrap; }
<translation>Alt+A</translation>
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="126"/>
<location filename="../forms/sendcoinsentry.ui" line="120"/>
<source>Paste address from clipboard</source>
<translation>Lim inn adresse fra utklippstavlen</translation>
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="136"/>
<location filename="../forms/sendcoinsentry.ui" line="130"/>
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
<message>
<location filename="../forms/sendcoinsentry.ui" line="146"/>
<location filename="../forms/sendcoinsentry.ui" line="137"/>
<source>Remove this recipient</source>
<translation>Fjern denne mottakeren</translation>
</message>
<message>
<location filename="../sendcoinsentry.cpp" line="21"/>
<location filename="../sendcoinsentry.cpp" line="25"/>
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
<translation>Skriv inn en Bitcoin adresse (f.eks. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
</message>
@@ -1220,158 +1221,158 @@ p, li { white-space: pre-wrap; }
<context>
<name>TransactionView</name>
<message>
<location filename="../transactionview.cpp" line="48"/>
<location filename="../transactionview.cpp" line="61"/>
<location filename="../transactionview.cpp" line="55"/>
<location filename="../transactionview.cpp" line="71"/>
<source>All</source>
<translation>Alle</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="49"/>
<location filename="../transactionview.cpp" line="56"/>
<source>Today</source>
<translation>I dag</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="50"/>
<location filename="../transactionview.cpp" line="57"/>
<source>This week</source>
<translation>Denne uken</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="51"/>
<location filename="../transactionview.cpp" line="58"/>
<source>This month</source>
<translation>Denne måneden</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="52"/>
<location filename="../transactionview.cpp" line="59"/>
<source>Last month</source>
<translation>Forrige måned</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="53"/>
<location filename="../transactionview.cpp" line="60"/>
<source>This year</source>
<translation>Dette året</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="54"/>
<location filename="../transactionview.cpp" line="61"/>
<source>Range...</source>
<translation>Intervall...</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="62"/>
<location filename="../transactionview.cpp" line="72"/>
<source>Received with</source>
<translation>Mottatt med</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="64"/>
<location filename="../transactionview.cpp" line="74"/>
<source>Sent to</source>
<translation>Sendt til</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="66"/>
<location filename="../transactionview.cpp" line="76"/>
<source>To yourself</source>
<translation>Til deg selv</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="67"/>
<location filename="../transactionview.cpp" line="77"/>
<source>Mined</source>
<translation>Utvunnet</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="68"/>
<location filename="../transactionview.cpp" line="78"/>
<source>Other</source>
<translation>Andre</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="74"/>
<location filename="../transactionview.cpp" line="84"/>
<source>Enter address or label to search</source>
<translation>Skriv inn adresse eller merkelapp for søk</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="80"/>
<location filename="../transactionview.cpp" line="90"/>
<source>Min amount</source>
<translation>Minimumsbeløp</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="108"/>
<location filename="../transactionview.cpp" line="125"/>
<source>Copy address</source>
<translation>Kopier adresse</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="109"/>
<location filename="../transactionview.cpp" line="126"/>
<source>Copy label</source>
<translation>Kopier merkelapp</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="110"/>
<location filename="../transactionview.cpp" line="127"/>
<source>Edit label</source>
<translation>Rediger merkelapp</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="111"/>
<location filename="../transactionview.cpp" line="128"/>
<source>Show details...</source>
<translation>Vis detaljer...</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="244"/>
<location filename="../transactionview.cpp" line="261"/>
<source>Export Transaction Data</source>
<translation>Eksporter transaksjonsdata</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="246"/>
<location filename="../transactionview.cpp" line="263"/>
<source>Comma separated file (*.csv)</source>
<translation>Kommaseparert fil (*.csv)</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="254"/>
<location filename="../transactionview.cpp" line="271"/>
<source>Confirmed</source>
<translation>Bekreftet</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="255"/>
<location filename="../transactionview.cpp" line="272"/>
<source>Date</source>
<translation>Dato</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="256"/>
<location filename="../transactionview.cpp" line="273"/>
<source>Type</source>
<translation>Type</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="257"/>
<location filename="../transactionview.cpp" line="274"/>
<source>Label</source>
<translation>Merkelapp</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="258"/>
<location filename="../transactionview.cpp" line="275"/>
<source>Address</source>
<translation>Adresse</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="259"/>
<location filename="../transactionview.cpp" line="276"/>
<source>Amount</source>
<translation>Beløp</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="260"/>
<location filename="../transactionview.cpp" line="277"/>
<source>ID</source>
<translation>ID</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="264"/>
<location filename="../transactionview.cpp" line="281"/>
<source>Error exporting</source>
<translation>Feil ved eksport</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="264"/>
<location filename="../transactionview.cpp" line="281"/>
<source>Could not write to file %1.</source>
<translation>Kunne ikke skrive til filen %1.</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="352"/>
<location filename="../transactionview.cpp" line="369"/>
<source>Range:</source>
<translation>Intervall:</translation>
</message>
<message>
<location filename="../transactionview.cpp" line="360"/>
<location filename="../transactionview.cpp" line="377"/>
<source>to</source>
<translation>til</translation>
</message>
@@ -2326,4 +2327,12 @@ men kommentaren vil bli blank.</translation>
<translation>beta</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../bitcoin.cpp" line="145"/>
<source>Bitcoin Qt</source>
<translation type="unfinished"/>
</message>
</context>
</TS>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -143,30 +143,34 @@ void OverviewPage::setNumTransactions(int count)
void OverviewPage::setModel(WalletModel *model)
{
this->model = model;
if(model)
{
// Set up transaction list
TransactionFilterProxy *filter = new TransactionFilterProxy();
filter->setSourceModel(model->getTransactionTableModel());
filter->setLimit(NUM_ITEMS);
filter->setDynamicSortFilter(true);
filter->setSortRole(Qt::EditRole);
filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
// Set up transaction list
TransactionFilterProxy *filter = new TransactionFilterProxy();
filter->setSourceModel(model->getTransactionTableModel());
filter->setLimit(NUM_ITEMS);
filter->setDynamicSortFilter(true);
filter->setSortRole(Qt::EditRole);
filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
ui->listTransactions->setModel(filter);
ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
ui->listTransactions->setModel(filter);
ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
// Keep up to date with wallet
setBalance(model->getBalance(), model->getUnconfirmedBalance());
connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
// Keep up to date with wallet
setBalance(model->getBalance(), model->getUnconfirmedBalance());
connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
setNumTransactions(model->getNumTransactions());
connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int)));
setNumTransactions(model->getNumTransactions());
connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int)));
connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(displayUnitChanged()));
connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(displayUnitChanged()));
}
}
void OverviewPage::displayUnitChanged()
{
if(!model || !model->getOptionsModel())
return;
if(currentBalance != -1)
setBalance(currentBalance, currentUnconfirmedBalance);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

After

Width:  |  Height:  |  Size: 781 B

View File

@@ -43,9 +43,11 @@ void SendCoinsDialog::setModel(WalletModel *model)
entry->setModel(model);
}
}
setBalance(model->getBalance(), model->getUnconfirmedBalance());
connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
if(model)
{
setBalance(model->getBalance(), model->getUnconfirmedBalance());
connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
}
}
SendCoinsDialog::~SendCoinsDialog()
@@ -57,6 +59,10 @@ void SendCoinsDialog::on_sendButton_clicked()
{
QList<SendCoinsRecipient> recipients;
bool valid = true;
if(!model)
return;
for(int i = 0; i < ui->entries->count(); ++i)
{
SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
@@ -255,6 +261,9 @@ void SendCoinsDialog::handleURL(const QUrl *url)
void SendCoinsDialog::setBalance(qint64 balance, qint64 unconfirmedBalance)
{
Q_UNUSED(unconfirmedBalance);
if(!model || !model->getOptionsModel())
return;
int unit = model->getOptionsModel()->getDisplayUnit();
ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balance));
}

View File

@@ -44,6 +44,8 @@ void SendCoinsEntry::on_pasteButton_clicked()
void SendCoinsEntry::on_addressBookButton_clicked()
{
if(!model)
return;
AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::SendingTab, this);
dlg.setModel(model->getAddressTableModel());
if(dlg.exec())
@@ -55,6 +57,8 @@ void SendCoinsEntry::on_addressBookButton_clicked()
void SendCoinsEntry::on_payTo_textChanged(const QString &address)
{
if(!model)
return;
ui->addAsLabel->setText(model->getAddressTableModel()->labelForAddress(address));
}
@@ -74,7 +78,7 @@ void SendCoinsEntry::clear()
ui->addAsLabel->clear();
ui->payAmount->clear();
ui->payTo->setFocus();
if(model)
if(model && model->getOptionsModel())
{
ui->payAmount->setDisplayUnit(model->getOptionsModel()->getDisplayUnit());
}

View File

@@ -155,36 +155,39 @@ TransactionView::TransactionView(QWidget *parent) :
void TransactionView::setModel(WalletModel *model)
{
this->model = model;
if(model)
{
transactionProxyModel = new TransactionFilterProxy(this);
transactionProxyModel->setSourceModel(model->getTransactionTableModel());
transactionProxyModel->setDynamicSortFilter(true);
transactionProxyModel = new TransactionFilterProxy(this);
transactionProxyModel->setSourceModel(model->getTransactionTableModel());
transactionProxyModel->setDynamicSortFilter(true);
transactionProxyModel->setSortRole(Qt::EditRole);
transactionProxyModel->setSortRole(Qt::EditRole);
transactionView->setModel(transactionProxyModel);
transactionView->setAlternatingRowColors(true);
transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
transactionView->setSortingEnabled(true);
transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder);
transactionView->verticalHeader()->hide();
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Status, 23);
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Date, 120);
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Type, 120);
transactionView->horizontalHeader()->setResizeMode(
TransactionTableModel::ToAddress, QHeaderView::Stretch);
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Amount, 100);
transactionView->setModel(transactionProxyModel);
transactionView->setAlternatingRowColors(true);
transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
transactionView->setSortingEnabled(true);
transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder);
transactionView->verticalHeader()->hide();
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Status, 23);
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Date, 120);
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Type, 120);
transactionView->horizontalHeader()->setResizeMode(
TransactionTableModel::ToAddress, QHeaderView::Stretch);
transactionView->horizontalHeader()->resizeSection(
TransactionTableModel::Amount, 100);
}
}
void TransactionView::chooseDate(int idx)
{
if(!transactionProxyModel)
return;
QDate current = QDate::currentDate();
dateRangeWidget->setVisible(false);
switch(dateWidget->itemData(idx).toInt())
@@ -231,17 +234,23 @@ void TransactionView::chooseDate(int idx)
void TransactionView::chooseType(int idx)
{
if(!transactionProxyModel)
return;
transactionProxyModel->setTypeFilter(
typeWidget->itemData(idx).toInt());
}
void TransactionView::changedPrefix(const QString &prefix)
{
if(!transactionProxyModel)
return;
transactionProxyModel->setAddressPrefix(prefix);
}
void TransactionView::changedAmount(const QString &amount)
{
if(!transactionProxyModel)
return;
qint64 amount_parsed = 0;
if(BitcoinUnits::parse(model->getOptionsModel()->getDisplayUnit(), amount, &amount_parsed))
{
@@ -294,6 +303,8 @@ void TransactionView::contextualMenu(const QPoint &point)
void TransactionView::copyAddress()
{
if(!transactionView->selectionModel())
return;
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
if(!selection.isEmpty())
{
@@ -303,6 +314,8 @@ void TransactionView::copyAddress()
void TransactionView::copyLabel()
{
if(!transactionView->selectionModel())
return;
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
if(!selection.isEmpty())
{
@@ -312,16 +325,22 @@ void TransactionView::copyLabel()
void TransactionView::editLabel()
{
if(!transactionView->selectionModel() ||!model)
return;
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
if(!selection.isEmpty())
{
AddressTableModel *addressBook = model->getAddressTableModel();
if(!addressBook)
return;
QString address = selection.at(0).data(TransactionTableModel::AddressRole).toString();
if(address.isEmpty())
{
// If this transaction has no associated address, exit
return;
}
// Is address in address book? Address book can miss address when a transaction is
// sent from outside the UI.
int idx = addressBook->lookupAddress(address);
if(idx != -1)
{
@@ -343,6 +362,8 @@ void TransactionView::editLabel()
// Add sending address
EditAddressDialog dlg(EditAddressDialog::NewSendingAddress,
this);
dlg.setModel(addressBook);
dlg.setAddress(address);
dlg.exec();
}
}
@@ -350,6 +371,8 @@ void TransactionView::editLabel()
void TransactionView::showDetails()
{
if(!transactionView->selectionModel())
return;
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
if(!selection.isEmpty())
{
@@ -396,6 +419,8 @@ QWidget *TransactionView::createDateRangeWidget()
void TransactionView::dateRangeChanged()
{
if(!transactionProxyModel)
return;
transactionProxyModel->setDateRange(
QDateTime(dateFrom->date()),
QDateTime(dateTo->date()).addDays(1));

View File

@@ -60,7 +60,7 @@ class CDataStream;
class CAutoFile;
static const unsigned int MAX_SIZE = 0x02000000;
static const int VERSION = 50000;
static const int VERSION = 50001;
static const char* pszSubVer = "";
static const bool VERSION_IS_BETA = true;

View File

@@ -187,6 +187,14 @@ bool CWallet::EncryptWallet(const string& strWalletPassphrase)
}
Lock();
Unlock(strWalletPassphrase);
NewKeyPool();
Lock();
// Need to completely rewrite the wallet file; if we don't, bdb might keep
// bits of the unencrypted private key in slack space in the database file.
if (CDB::Rewrite(strWalletFile))
RemoveLogFilesOnShutdown(true);
}
return true;
@@ -289,6 +297,9 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
return true;
}
// Add a transaction to the wallet, or update it.
// 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)
{
uint256 hash = tx.GetHash();
@@ -551,6 +562,9 @@ bool CWalletTx::WriteToDisk()
return CWalletDB(pwallet->strWalletFile).WriteTx(GetHash(), *this);
}
// Scan the block chain (starting in pindexStart) for transactions
// from or to us. If fUpdate is true, found transactions that already
// exist in the wallet will be updated.
int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
{
int ret = 0;
@@ -1136,6 +1150,19 @@ int CWallet::LoadWallet(bool& fFirstRunRet)
return false;
fFirstRunRet = false;
int nLoadWalletRet = CWalletDB(strWalletFile,"cr+").LoadWallet(this);
if (nLoadWalletRet == DB_NEED_REWRITE)
{
if (CDB::Rewrite(strWalletFile, "\x04pool"))
{
RemoveLogFilesOnShutdown(true);
setKeyPool.clear();
// Note: can't top-up keypool here, because wallet is locked.
// User will be prompted to unlock wallet the next operation
// the requires a new key.
}
nLoadWalletRet = DB_NEED_REWRITE;
}
if (nLoadWalletRet != DB_LOAD_OK)
return nLoadWalletRet;
fFirstRunRet = vchDefaultKey.empty();
@@ -1221,6 +1248,34 @@ bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut)
return true;
}
//
// Mark old keypool keys as used,
// and generate all new keys
//
bool CWallet::NewKeyPool()
{
CRITICAL_BLOCK(cs_wallet)
{
CWalletDB walletdb(strWalletFile);
BOOST_FOREACH(int64 nIndex, setKeyPool)
walletdb.ErasePool(nIndex);
setKeyPool.clear();
if (IsLocked())
return false;
int64 nKeys = max(GetArg("-keypool", 100), (int64)0);
for (int i = 0; i < nKeys; i++)
{
int64 nIndex = i+1;
walletdb.WritePool(nIndex, CKeyPool(GenerateNewKey()));
setKeyPool.insert(nIndex);
}
printf("CWallet::NewKeyPool wrote %"PRI64d" new keys\n", nKeys);
}
return true;
}
bool CWallet::TopUpKeyPool()
{
CRITICAL_BLOCK(cs_wallet)

View File

@@ -13,6 +13,9 @@ class CWalletTx;
class CReserveKey;
class CWalletDB;
// A CWallet is an extension of a keystore, which also maintains a set of
// transactions and balances, and provides the ability to create new
// transactions
class CWallet : public CCryptoKeyStore
{
private:
@@ -57,9 +60,14 @@ public:
std::vector<unsigned char> vchDefaultKey;
// keystore implementation
// Adds a key to the store, and saves it to disk.
bool AddKey(const CKey& key);
// Adds a key to the store, without saving it to disk (used by LoadWallet)
bool LoadKey(const CKey& key) { return CCryptoKeyStore::AddKey(key); }
// Adds an encrypted key to the store, and saves it to disk.
bool AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
// Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
bool LoadCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret) { return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret); }
bool Unlock(const std::string& strWalletPassphrase);
@@ -82,6 +90,7 @@ public:
std::string SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false);
std::string SendMoneyToBitcoinAddress(const CBitcoinAddress& address, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false);
bool NewKeyPool();
bool TopUpKeyPool();
void ReserveKeyFromKeyPool(int64& nIndex, CKeyPool& keypool);
void KeepKey(int64 nIndex);
@@ -244,7 +253,7 @@ public:
unsigned int nTimeReceived; // time received by this node
char fFromMe;
std::string strFromAccount;
std::vector<char> vfSpent;
std::vector<char> vfSpent; // which outputs are already spent
// memory only
mutable char fDebitCached;
@@ -371,6 +380,7 @@ public:
return fReturn;
}
// make sure balances are recalculated
void MarkDirty()
{
fCreditCached = false;