Giter Site home page Giter Site logo

multibit-legacy / multibit-hd Goto Github PK

View Code? Open in Web Editor NEW
169.0 24.0 124.0 50.72 MB

Deprecated Bitcoin Wallet

Home Page: https://multibit.org/blog/2017/07/26/multibit-shutdown.html

License: Other

Shell 0.18% Java 96.77% Protocol Buffer 0.18% HTML 2.88%

multibit-hd's Introduction

Multibit is Deprecated - Do Not Use

Wednesday, July 26, 2017

Dear Bitcoin Community,

It is time for us to let Multibit go.

KeepKey acquired Multibit a little over 1 year ago. At the time, the engineers who originally built and supported Multibit had announced that they would no longer be working on it or providing support. Multibit played an important role in the Bitcoin infrastructure. We felt that it was important for Multibit to continue and hoped that with our existing support and development teams, we would be able to keep Multibit alive.

The reality is that Multibit is in need of a lot of work. It has stubborn bugs that have caused us and Multibit users much grief. Additionally, Bitcoin has gone through a fundamental change in regards to the way fees work. The addition of SegWit in the coming weeks will mean the Multibit software has fallen still further behind.

Unfortunately, KeepKey simply does not have the resources to support the current issues, nor to rebuild Multibit to ensure ideal user experience. By focusing our attention on the KeepKey device, we will continue building and improving the best hardware wallet available.

Thus, KeepKey will discontinue support and maintenance of Multibit, effective immediately.

We recommend that all Multibit users discontinue using it and you move your keys to other wallet software of your choosing.

Next Steps for Multibit Users

Videos that demonstrate how to move your wallet to Electrum are available on YouTube.

Please note that the version of Electrum available for download today (version 2.8.3) doesn’t fully support the importing Multibit HD wallet words. The version shown in the Multibit HD video is the soon-to-be-released next version.

Multibit was a fantastic piece of software in its time, and we want to thank the Multibit developers for such an important contribution to Bitcoin’s history.

Sincerely,

Ken Heutmaker

CTO, KeepKey


Build status: Build Status

Project status: Pre-release. Expect minor bugs and UI adjustments. Suitable for small scale production.

MultiBit HD (MBHD)

A desktop Hierarchical Deterministic Wallet (HDW) for Bitcoin using the Simplified Payment Verification (SPV) mode to provide very fast block chain synchronization.

The target audience is "international mainstream" which compels the user interface to remain as simple and consistent as possible while still retaining advanced capabilities under the covers.

Support for external hardware wallets (such as the Trezor) is available through the MultiBit Hardware project.

Main website

Pre-packaged installers are available from the MultiBit website.

Technologies

  • Java 7 and Swing
  • Bitcoinj - Providing various Bitcoin protocol utilities (GitHub is the reference)
  • hid4java - Java library providing USB Human Interface Device (HID) native interface
  • MultiBit Hardware - Java library providing Trezor support
  • Google Protocol Buffers (protobuf) - For use with serialization and hardware communications
  • Font Awesome - for iconography
  • Install4j - for a smooth installation and update process

Getting started

MultiBit HD is a standard Maven build from a GitHub repository and currently relies on some builds of libraries which aren't available in Maven Central.

Below are some basic instructions for developers - there is more information in the MultiBit HD wiki.

Verify you have Git

$ git --version

Install git if necessary.

Then, if this is your first time working with MultiBit HD source code, clone the source code repository (over HTTPS) using:

$ git clone https://github.com/keepkey/multibit-hd.git

A sub-directory called multibit-hd will be created which is your project root directory.

To update a previous clone of MultiBit HD use a pull instead:

$ cd <project root>
$ git pull

Verify you have Maven 3+

Most IDEs (such as Intellij Community Edition) come with support for Maven built in, but if not then you may need to install it manually.

IDEs such as Eclipse may require the m2eclipse plugin to be configured.

To quickly check that you have Maven 3+ installed check on the command line:

$ mvn --version

Maven uses a file called pom.xml present in the MultiBit HD source code project directory to provide all the build information.

We currently use a forked version of Bitcoinj

The MultiBit Staging repository contains a fork of the bitcoinj library and its supporting Orchid JAR for Tor that is aligned with the MultiBit HD develop branch. This should be used for development builds and is suitable for production. As we make changes to our fork we update the staging repository.

Our release cycle is different to that of bitcoinj and our version reflects as accurately as we can the state of play when the bitcoinj fork code was frozen. For example bitcoinj-0.13-SNAPSHOT-alice-0.0.9 should be interpreted as "a snapshot of upstream bitcoinj 0.13 that has additional code (alice) that is released under version 0.0.9".

Deeper analysis of the actual git upstream can be seen through the tagging of the master branch.

Wherever possible, and time permitting, we will introduce our forked changes as a pull request into the upstream bitcoinj so that other projects can benefit but we must use a fork to ensure rapid updates are possible during development.

Anyone wishing to handle this part of the process is very welcome to offer up their assistance!

Start the application (from an IDE)

To run the application within an IDE, simply execute MultiBitHD.main() in the mbhd-swing module. No command line parameters are needed, although a Bitcoin URI is accepted.

Start the application (from the command line)

To run the application from the command line, first build from the project root directory (pulling in all sources from upstream):

$ cd <project root>
$ mvn clean dependency:sources install

then start the application using the shaded JAR:

$ java -jar mbhd-swing/target/multibit-hd.jar

No command line parameters are needed, although BIP 21 and BIP 72 Bitcoin URIs are accepted. In the example below a BIP 21 Bitcoin URI is presented, the quotes are required to avoid URL decoding:

$ java -jar mbhd-swing/target/multibit-hd.jar "bitcoin:1AhN6rPdrMuKBGFDKR1k9A8SCLYaNgXhty?amount=0.01&label=Please%20donate%20to%20multibit.org"

Multiple instances

MultiBit HD will avoid multiple instances by using port 8330 as a method of detecting another running instance. If port 8330 cannot be bound MultiBit HD will assume that another instance is running and hand over any Bitcoin URI arguments present when it started. It will then perform a hard shutdown terminating its own JVM. The other instance will react to receiving a Bitcoin URI message on port 8330 by displaying an alert bar requesting the user to act upon the Bitcoin URI payment request.

Frequently asked questions (FAQ)

Here are some common questions that developers ask when they first encounter MBHD.

How can I contribute ?

Simply add yourself as a watcher to the repository and keep and eye on issues that interest you.

In general issues are labelled with a yellow awaiting review or a blue in progress to indicate where our attention is focused. We would appreciate you updating and running up the code and verifying that an awaiting review does what it is supposed to. If you could then post a comment similar to Works for me on Linux then that would help us to close off the issue faster, or engage further with it to get bugs fixed.

Of course, if you want to contribute coding effort or deeper code review and commentary that would be most appreciated as well. We want MultiBit HD to be as solid as we can make it.

As always, donations to the MultiBit address are welcome: 1AhN6rPdrMuKBGFDKR1k9A8SCLYaNgXhty.

Where's the Trezor support ?

We've begun the process of integrating the Trezor device through the MultiBit Hardware project. If you are a hardware wallet developer, or are just interested to learn how the Trezor device works under the covers please watch this project.

From now you should be able to attach your Trezor device and see an alert message providing information and a button to switch your current wallet over to one that tracks your Trezor device. All private keys remain on the Trezor device and associated contacts, payments and so on are keep encrypted in your wallet.

Why not Java 8 ?

At the time MBHD was being written (Q4 2013 - Q2 2014) Java 8 was not in production release and the sheer size of the packaged download was coming in at 150Mb (18x MultiBit Classic and 3x the standard Java 7 packaged footprints). That footprint alone would be sufficient to dramatically increase the cost of serving the application and deter people from downloading in countries where bandwidth is less available.

We will revisit this once we have suitable Install4j JREs available. We expect this to occur shortly after Release 0.1.

Why not JavaFX ?

JavaFX was only available as version 2.2 on Java 7 and the move to Java 8 was not going to happen. There were many significant features missing in JavaFX 2.2 which would only be fixed in Java 8:

  • no right to left languages (Hebrew, Farsi, Arabic, etc)
  • no integration with native platform for Bitcoin URI protocol handling (no BIP 21 or 72 support)
  • no reporting uncaught exceptions (no error reporting)

Thus this technology was not suitable for the very wide range of people using MultiBit in all corners of the globe.

Why Swing ?

There is a vast amount of support for Swing. The code is near bullet-proof for most use cases and it fully supports internationalization which is a key requirement for MultiBit HD. Also, many of the supporting libraries for Swing pre-date 2009 making it much harder for dependency chain attacks to take place.

With some effort Swing can be made to look quite modern.

Swing also allows us to smoothly integrate with the native platform which puts it ahead of JavaFX until at least Q3 2015.

Why not SwingX ?

SwingX is a large support library that introduces a lot of additional functionality to Swing applications. Much of this additional functionality is not required by MultiBit or can be relatively easily worked around. Consequently including it would increase the available attack surface.

Why the Nimbus look and feel ?

In Java 7 the Nimbus look and feel became integrated with the JDK. It provides a modern 2D rendered UI that is the same across all platforms. It is highly customisable through simple themes and provides consistent painting behaviour across platforms. For example to paint a button red in Swing using the Mac-only Aqua theme requires complex custom ButtonUI code.

Using Nimbus ensures that we don't have this or similar problems.

Technical details on the default colours

I want an installer not this IDE

Installers lag the latest changes by a few weeks. You can find them on the MultiBit HD website.

As new changes are released they will update automatically over HTTPS from 0.0.4 (Private Beta 4) onwards.

Is there a developer wiki ?

Yes. The wiki pages provide comprehensive instructions for developers that cover a variety of environments.

What is your development roadmap ?

We are currently working to the following timetable:

  1. Hardware wallet (Trezor) support (see version 0.0.5 issues)
  2. BIP70-73 payment protocol support (see version 0.1.0 issues)
  3. Hierarchical deterministic multi-signature (HDM) support (still planning)

Developer tools

This section covers tools to assist developers when developing MBHD code.

Executing the automated requirements tests

We use Swing FEST to perform automated requirements testing of the user interface. It gives super fast overview of the application and runs like a standard unit test. MultiBitHDFestTest provides the entry point.

This provides an ever-improving set of regression tests to ensure that new code does not break the existing work.

The code is arranged as a single test case with multiple individual tests that are independent of each other. Each create their own temporary application directory and may or may not require an initial randomly created empty wallet.

Developers are strongly encouraged to create a FEST test for any UI work they are about to undertake and use it to actually test the work in progress. It is far faster to run FEST than to manually run up the application and do it manually.

FEST is not intended to run as part of a Maven build since not all build environments support a display.

Upgrading Font Awesome

Use the FontAwesomeTools to create the necessary enum entries for AwesomeIcon as required.

Changing resource bundles

Use the ResourceBundleTools to find similar entries and to arrange keys in the same order across all bundles.

Updating the internal help files

To do an internal help refresh:

  1. Ensure you have cloned the MultiBit website into a sibling directory to MultiBit HD
  2. Switch to the appropriate site branch (e.g. master for ongoing releases) and update
  3. Use Ant to execute the update-internal-help.xml script to copy the relevant files into the correct locations
  4. Within Intellij, navigate to assets/images/en/screenshots/mbhd-01, select all image files and copy to clipboard
  5. Paste image names into HelpScreenView where directed (remove existing)
  6. Update any FEST tests that rely on particular text being in place
  7. Run without a network connection to verify that the internal help appears correctly
  8. Check internal and external links work correctly
  9. Check IDE Changes to ensure no new files have been missed

Updating the internationalisation files

To do an i18n refresh:

  1. Download the i18n zip using the Download button
  2. Unzip this to a directory multibit-hd
  3. Copy multibit-hd to: mbhd-swing/src/main/resources/languages-from-crowdin
  4. Run a terminal and cd to mbhd-swing/src/main/resources/languages-from-crowdin
  5. Run the script ./move-files.sh

This moves and renames all the files into the languages directory. If there are any files or new languages it lists them at the end so that you can see there is something missing from the move-files script.

multibit-hd's People

Contributors

ayman-abdelghany avatar bgok avatar drizzt avatar gary-rowe avatar hegjon avatar jim618 avatar kliyer avatar mvaneijk avatar prusnak avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

multibit-hd's Issues

Consider setting default wallet name on creation

Without a wallet name on creation the switch wallet combo is empty and looks confusing.
We also see 'null' in the History table which looks a bit poor.

suggest we set it to something like 'Wallet created 08 may 2014'

It will put the horizontal scrollbar in the side panel but that's not too bad visually.

Migrate to encrypted HD wallets

Wallet format revamp, including:

  • move to encrypted wallets
  • move to HD wallets
  • have rolling backups for each type of file stored (and auto read if there are problems)
  • get copy to cloud backups working correctly

Change password quirky if wrong old password entered

If you enter a wrong password the next button is disabled but then if you add new passwords and go back to correct the old one the next button never seems to get enabled.

Anyhow, you can get it into the state where you have to close it and redo it all.

Currently tricky to access Welcome wizard until logged in

You have to log in to a wallet before accessing the Welcome wizard.
Perhaps add a 'More options' on the Password entry screen to go to the second welcome wizard screen. Or integrate the 'restore password' into the welcome screen.

Cannot switch wallet in panel 2 of welcome wizard

You get an error:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: 'SELECT_WALLET_SWITCH' is not a valid panel name. Check the panel has been registered in the view map.
    at com.google.common.base.Preconditions.checkState(Preconditions.java:176)
    at org.multibit.hd.ui.views.wizards.AbstractWizard.show(AbstractWizard.java:119)
...
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: 'SELECT_WALLET_SWITCH' is not a valid panel name. Check the panel has been registered in the view map.
    at com.google.common.base.Preconditions.checkState(Preconditions.java:176)
    at org.multibit.hd.ui.views.wizards.AbstractWizard.show(AbstractWizard.java:119)
...

And have to shut MBHD down to get off the panel as it is borked.

Wallet save can bork MBHD on exit

Deadlock:

Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.0-b56 mixed mode):

"Wallet autosave thread" daemon prio=5 tid=0x00007fecf3ca0000 nid=0xd763 waiting on condition [0x000000015d139000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c1336b0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
at com.google.common.util.concurrent.CycleDetectingLockFactory$CycleDetectingReentrantLock.lock(CycleDetectingLockFactory.java:819)
at com.google.bitcoin.core.Wallet.saveToFile(Wallet.java:633)
at com.google.bitcoin.core.Wallet.saveToFile(Wallet.java:675)
at org.multibit.hd.core.managers.BackupManager.createRollingBackup(BackupManager.java:268)
at org.multibit.hd.core.managers.WalletAutoSaveListener.onAfterAutoSave(WalletAutoSaveListener.java:45)
at com.google.bitcoin.wallet.WalletFiles.saveNowInternal(WalletFiles.java:127)
at com.google.bitcoin.wallet.WalletFiles.access$200(WalletFiles.java:40)
at com.google.bitcoin.wallet.WalletFiles$1.call(WalletFiles.java:97)
at com.google.bitcoin.wallet.WalletFiles$1.call(WalletFiles.java:89)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-wizard-hide-0" daemon prio=5 tid=0x00007fecf580a800 nid=0x12207 waiting on condition [0x0000000158b09000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c5a4a68> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-scheduled-hide-progress-1" daemon prio=5 tid=0x00007fecf3c2f800 nid=0x11d03 waiting on condition [0x000000015d936000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c12ea38> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-wizard-hide-0" daemon prio=5 tid=0x00007fecf3c76000 nid=0x10307 waiting on condition [0x000000015ca24000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c345620> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf3c3f000 nid=0x11903 waiting on condition [0x000000015df7c000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c348fe8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf3c3e000 nid=0x11807 waiting on condition [0x000000015de79000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c350eb8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf3c3d800 nid=0x11503 waiting on condition [0x000000015dd76000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c347b88> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf3c3c800 nid=0x11303 waiting on condition [0x000000015d036000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c3485d8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf580d000 nid=0x11103 waiting on condition [0x000000015cf33000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c350468> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf51e8800 nid=0x10f03 waiting on condition [0x000000015c60c000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c34c658> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf580c000 nid=0x10d03 waiting on condition [0x000000015c509000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c340c10> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf3f5b000 nid=0x10a03 waiting on condition [0x000000015dc73000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c3518c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf5d3a800 nid=0x10803 waiting on condition [0x000000015d44e000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c344bd0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf51b4000 nid=0x10603 waiting on condition [0x000000015d34b000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c3542a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf51af000 nid=0x10403 waiting on condition [0x000000015d248000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c34d0a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf3c7d000 nid=0xc90f waiting on condition [0x000000015ce30000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c349a38> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-gravatar-0" daemon prio=5 tid=0x00007fecf5d3c800 nid=0xf50f waiting on condition [0x000000015cb52000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c34fa98> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"SwingWorker-pool-33-thread-1" daemon prio=5 tid=0x00007fecf2e28000 nid=0xd52b waiting on condition [0x000000015c921000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c35cf10> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-scheduled-hide-progress-0" daemon prio=5 tid=0x00007fecf3fb9000 nid=0xff03 waiting on condition [0x000000015c091000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c12ea38> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1079)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-scheduled-tx-seen-0" daemon prio=5 tid=0x00007fecf5330000 nid=0xd82f waiting on condition [0x000000015b0af000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c16d568> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1079)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"AbstractTimeoutHandler timeouts" daemon prio=5 tid=0x00007fecf3c23000 nid=0xf907 in Object.wait() [0x000000015b407000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000010c260bf0> (a java.util.TaskQueue)
at java.lang.Object.wait(Object.java:503)
at java.util.TimerThread.mainLoop(Timer.java:526)
- locked <0x000000010c260bf0> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)

"safe-fixed-bitcoin-network-0" daemon prio=5 tid=0x00007fecf5c2a800 nid=0xfc03 waiting on condition [0x000000015cd2d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c2267e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-latest-ticker-0" daemon prio=5 tid=0x00007fecf3a6f000 nid=0xe903 waiting on condition [0x000000015c2a3000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c24a958> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-wallet-services-0" daemon prio=5 tid=0x00007fecf5908800 nid=0xe303 waiting on condition [0x000000015b82d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c16d820> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-wizard-hide-0" daemon prio=5 tid=0x00007fecf3c19000 nid=0xe103 waiting on condition [0x000000015c406000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010bae5f70> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"bitcoinj user thread" daemon prio=5 tid=0x00007fecf3b3c000 nid=0xdf03 waiting on condition [0x000000015bf8e000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c133af0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at com.google.common.util.concurrent.Uninterruptibles.takeUninterruptibly(Uninterruptibles.java:221)
at com.google.bitcoin.utils.Threading$UserThread.run(Threading.java:104)

"safe-fixed-check-password-0" daemon prio=5 tid=0x00007fecf3b2c000 nid=0xde07 waiting on condition [0x000000015b596000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c15ea90> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"safe-fixed-check-password-0" daemon prio=5 tid=0x00007fecf2d2b800 nid=0xc707 waiting on condition [0x000000015a4c6000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010bb293a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

"TimerQueue" daemon prio=5 tid=0x00007fecf3b1f000 nid=0xb707 waiting on condition [0x00000001552a5000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010bb28c48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
at java.util.concurrent.DelayQueue.take(DelayQueue.java:220)
at javax.swing.TimerQueue.run(TimerQueue.java:171)
at java.lang.Thread.run(Thread.java:724)

"DestroyJavaVM" prio=5 tid=0x00007fecf281f000 nid=0x1903 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"AWT-EventQueue-0" prio=5 tid=0x00007fecf2921000 nid=0x4b2b waiting on condition [0x000000015509c000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010c16d348> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
at java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1468)
at com.google.bitcoin.wallet.WalletFiles.shutdownAndWait(WalletFiles.java:142)
at com.google.bitcoin.core.Wallet.shutdownAutosaveAndWait(Wallet.java:785)
at org.multibit.hd.core.services.BitcoinNetworkService.closeWallet(BitcoinNetworkService.java:891)
at org.multibit.hd.core.services.BitcoinNetworkService.stopAndWait(BitcoinNetworkService.java:146)
at org.multibit.hd.core.services.AbstractService.onShutdownEvent(AbstractService.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
- locked <0x000000010c2d4ca8> (a com.google.common.eventbus.SynchronizedEventSubscriber)
at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
at com.google.common.eventbus.EventBus.post(EventBus.java:275)
at org.multibit.hd.core.events.CoreEvents.fireShutdownEvent(CoreEvents.java:167)
at org.multibit.hd.ui.views.wizards.AbstractWizard$2.actionPerformed(AbstractWizard.java:232)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

"AWT-Shutdown" prio=5 tid=0x00007fecf292e800 nid=0x440b in Object.wait() [0x0000000154f9c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000010bae8f10> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:287)
- locked <0x000000010bae8f10> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:724)

"async-log-appender-0" daemon prio=5 tid=0x00007fecf2940800 nid=0xb50b waiting on condition [0x0000000154d96000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000010bb29b08> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.multibit.hd.core.logging.AsyncAppender.run(AsyncAppender.java:74)
at java.lang.Thread.run(Thread.java:724)

"Java2D Queue Flusher" daemon prio=5 tid=0x00007fecf3948800 nid=0xa707 in Object.wait() [0x0000000154056000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000010bae9310> (a sun.java2d.opengl.OGLRenderQueue$QueueFlusher)
at sun.java2d.opengl.OGLRenderQueue$QueueFlusher.run(OGLRenderQueue.java:208)
- locked <0x000000010bae9310> (a sun.java2d.opengl.OGLRenderQueue$QueueFlusher)

"Java2D Disposer" daemon prio=5 tid=0x00007fecf39ec800 nid=0x9713 in Object.wait() [0x0000000153d13000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000010b844290> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x000000010b844290> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at sun.java2d.Disposer.run(Disposer.java:145)
at java.lang.Thread.run(Thread.java:724)

"AppKit Thread" daemon prio=5 tid=0x00007fecf2a4f800 nid=0x707 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" daemon prio=5 tid=0x00007fecf3889800 nid=0x5d03 runnable [0x000000014fc42000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
- locked <0x00000001361c8320> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
- locked <0x00000001361c8320> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:85)
at java.lang.Thread.run(Thread.java:724)

"Service Thread" daemon prio=5 tid=0x00007fecf287e000 nid=0x5903 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=5 tid=0x00007fecf287d000 nid=0x5703 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=5 tid=0x00007fecf286d800 nid=0x5503 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=5 tid=0x00007fecf3820000 nid=0x5303 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=5 tid=0x00007fecf3814800 nid=0x4003 in Object.wait() [0x000000014f0bb000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000010b969428> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x000000010b969428> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=5 tid=0x00007fecf3814000 nid=0x3e03 in Object.wait() [0x000000014efb8000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000010b963230> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x000000010b963230> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=5 tid=0x00007fecf2857800 nid=0x3c03 runnable

"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fecf282b000 nid=0x3803 runnable

"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fecf282c000 nid=0x3a03 runnable

"VM Periodic Task Thread" prio=5 tid=0x00007fecf2862800 nid=0x5b03 waiting on condition

JNI global references: 910

Heap
PSYoungGen total 22528K, used 513K [0x0000000136180000, 0x0000000138500000, 0x000000014b700000)
eden space 22016K, 2% used [0x0000000136180000,0x0000000136200510,0x0000000137700000)
from space 512K, 0% used [0x0000000137700000,0x0000000137700000,0x0000000137780000)
to space 7168K, 0% used [0x0000000137e00000,0x0000000137e00000,0x0000000138500000)
ParOldGen total 43520K, used 18150K [0x000000010b700000, 0x000000010e180000, 0x0000000136180000)
object space 43520K, 41% used [0x000000010b700000,0x000000010c8b98b0,0x000000010e180000)
PSPermGen total 58880K, used 35940K [0x0000000106500000, 0x0000000109e80000, 0x000000010b700000)
object space 58880K, 61% used [0x0000000106500000,0x0000000108819320,0x0000000109e80000)

Require a "no exchange provider" option

Some people may never want to leave the Bitcoin ecosystem and/or do not require any exchange rate service.

We should provide an option of "NONE" in ExchangeKey and change the Exchange to an Optional. This will have a small knock-on effect making this a slightly more than trivial refactoring.

Consider addition of BRIT fee slider

Provide a mechanism to dial the BRIT client fee up (yay) or down (boo) to:

  • indicate how much support the user wishes to give to ongoing development
  • provide a psychological mechanism so that the user is in control

I think this should be in a later edition of the code - possibly after public beta.

For clarity, this is not the Bitcoin transaction fee.

Exchange rate preferences quirky with OER

The exchange rate setting panel is a bit quirky with Open Exchange Rates.
If you set an access key, go to another exchange and then go back you have to enter the access key again to see the list of currencies.

Get wallet saving working

Get wallet saving using pure bitcoinj, including increased depth rolling backups and integration with BackupManager

There was an error creating a connection to the Bitcoin network

After running from Eclipse, I see an error message in lower-right with red light:

There was an error creating a connection to the Bitcoin network

A payment made to the Recipient address under "Request payment" does not show up.

So it looks like there is no connection to the network.

Was there something I needed to configure?

Contact image glitch during search

Contact images glitch when the search is triggered. For large collections this can cause a problem.

Caused by not caching images and having instant image lookup occur during table refresh.

Support for webcam on send

At first blush this looks like a nightmare of compatibility problems. However, the use case of "customer in coffee shop paying with MBHD installed on laptop with webcam" would require the ability to scan a QR code.

Here is a suitable library that does the job that is still active.

Unexpected behavior when adding and deleting contacts.

Some minor UX issues:

Clicking cancel after clicking Add+ in the contact section creates a new contact anyway. This occurs even if no information is added. Expected behavior for me would be for it not to add the contact at all especially if no information was added. Clicking cancel after some data was added could prompt the user to make sure they wanted to cancel the action.

Additionally, when the contact box only has one contact in it, clicking delete doesn't remove the contact from the list until after moving to a different pane in the wallet and back.

Improve wallet backups

The wallet backups is currently overzealous.
Improve to something like:

bitcoinj wallet write

  • this is a two stage write
  • wallet.saveNow is done instantly
  • wallet.saveLater - set to a 30 seconds period
  • make a save at MBHD exit

rolling backups

  • make saves every 2 minutes
  • make first save 2 minutes after MBHD start (most likely after initial sync)
  • make a save at MBHD exit

local zip backups

  • make saves every 10 minutes
  • make first save 2 minutes after MBHD start
  • make a save at MBHD exit

cloud backups

  • make saves every 30 minutes
  • make first save 2 minutes after MBHD start
  • make a save at MBHD exit

Don't bother tracking if the wallet is dirty, this only really affects the rolling backups and isn't worth the bother of writing a wallet extension to track it.

testFindWalletDirectories and testFindWallets fails

Hi,
I notice that testFindWalletDirectories and testFindWallets fails on OpenJDK 7.0 under Linux.
In my case walletDirectories.get(0).getAbsolutePath() == walletPath2 and walletDirectories.get(1).getAbsolutePath() == walletPath1, exactly the opposite of the 4 asserts (line 250, 251, 267, 269 of WalletManagerTest.java)

Failed to install artifact org.multibit.hd:mbhd-brit:zip:deterministic:0.0.1-SNAPSHOT

$ mvn clean install

gave:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project mbhd-brit: Failed to install artifact org.multibit.hd:mbhd-brit:zip:deterministic:0.0.1-SNAPSHOT: /Users/rich/src/java/multibit-hd/mbhd-brit/target/mbhd-brit-0.0.1-SNAPSHOT-deterministic.zip (No such file or directory) -> [Help 1]

Previously installed bitcoinj with:

$ mvn install:install-file -Dfile=/Users/rich/src/java/bitcoinj/core/target/bitcoinj-0.12-SNAPSHOT.jar -DpomFile=/Users/rich/src/java/bitcoinj/pom.xml

I'm not much of a Maven user, so there's every possibility I've botched the bitcoinj installation.

Running OS X Mavericks.

Any ideas?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.