Phoenix The Bitcoin wallet from the future

8 minute read


Wallet Logo

This app was first launched on 10th December 2019 and currently has more than 1000 downloads, a 4.6 stars rating from 114 users and the latest APK is version 1.3.1.

Our last analysis was done on 13th January 2020 based on data found in their Google Play description and their website and their source repository. We discuss verification with the provider in this issue.

We found these ways of contacting the developers:

Help spread awareness for build reproducibility

Please help us spread the word, asking Phoenix : The Bitcoin wallet from the future to support reproducible builds via their Twitter!


The following Analysis is not a full code review! We plan to make code reviews available in the future but even then it will never be a stamp of approval but rather a list of incidents and bad coding practice. We cannot find and tell you all the dark secrets the wallet providers might have.

Do your own research!

Try out searching for "lost bitcoins", "stole my money" or "scammers" together with the wallet's name, even if you think the wallet is generally trustworthy. For all the bigger wallets you will find accusations. Make sure you understand why they were made and if you are comfortable with the provider's reaction.

The Analysis

This app recently achieved 1000 downloads, so this is the first time we actually look at it in detail.

The PlayStore description, below in its entirety:

Phoenix is a next-generation Bitcoin wallet that lets you send and receive Bitcoin easily.

Phoenix natively supports Lightning for fast and cheap transactions.

So it’s a Bitcoin wallet but no word whether it is custodial or has public source code.

The website is more clear about those doubts:

⚡ Native Lightning support

🛡 Non custodial

👍 Intuitive and simple UX

and a link to their GitHub.

There, the build instructions though are rather vague. Let’s see how far we get, as always without using AndroidStudio and searching for relevant revisions:

$ git clone
$ cd eclair
$ git checkout android-phoenix

Unfortunately this is as far as get as there is no hint at to which revision might be relevant to our Phoenix 1.0.1 release:

$ tig
2020-01-10 15:53 +0100 dpad85              M─┐ [android-phoenix] {origin/android-phoenix} Merge branch 'android' into android-phoenix
2020-01-10 14:38 +0100 sstone               M─┐ {origin/android} Merge branch 'master' into android
2020-01-10 14:37 +0100 Fabrice Drouin       o Restore missing 'db.close()' methods (#1272)
2020-01-10 14:56 +0100 dpad85              o Remove feature graph validation in payment request
2020-01-10 11:53 +0100 dpad85              M─│─│─┐ Merge branch 'android' into android-phoenix
2020-01-09 18:07 +0100 sstone               M─│─┤ Merge branch 'master' into android
2020-01-09 13:47 +0100 Bastien Teinturier   o─┘ Flat features (#1253)
2020-01-08 16:47 +0100 Bastien Teinturier   o Disable Trampoline-MPP to non-Phoenix recipients (#1271)
2020-01-09 19:39 +0100 dpad85              M─│─│─┐ Merge branch 'android' into android-phoenix
2020-01-08 14:09 +0100 Fabrice Drouin       o─│─┘ Fix Outpoint JSON serialization (#1270)
2020-01-08 12:08 +0100 sstone               o Fix dependency conflict in eclair-node
2020-01-08 11:46 +0100 sstone               M─│─┐ Merge branch 'master' into android
2020-01-07 16:49 +0100 Bastien Teinturier   o─┘ Remove mockito from switchboard tests (#1267)
2020-01-07 16:44 +0100 Pierre-Marie Padiou  o More consistency in sending messages during sync (#1268)
2020-01-06 14:00 +0100 sstone               M─│─┐ Merge branch 'master' into android
2019-12-24 14:06 +0200 Anton Kumaigorodski  o─┘ Remove repeated code (#1265)
2019-12-24 02:11 -0600 Mike W. Erwin        o Added some instructions for TOR auth (#1262)
2019-12-18 16:39 +0100 Bastien Teinturier   o Improve CommandSend type (#1260)
2019-12-18 14:34 +0100 Bastien Teinturier   o Relay Trampoline payments (#1220)
2019-12-17 10:41 +0100 Bastien Teinturier   o Update Maven (3.6.3) (#1259)
2019-12-12 09:22 +0100 Dominique            o Add synchronization when locking database connection (#1200)
2019-12-11 15:40 +0200 Anton Kumaigorodski  o Add HasHtlcIdCommand trait (#1245)
2019-12-11 14:16 +0100 Pierre-Marie Padiou  o Better randomization of reconnection delay (#1250)
2019-12-11 14:03 +0100 Pierre-Marie Padiou  o Minor: missing log category in peer (#1241)
2019-12-11 13:53 +0100 Bastien Teinturier   o MPP: don't retry if failure comes from final recipient (#1246)
2019-12-10 13:40 +0100 Pierre-Marie Padiou  o Minor: ignore "disconnecting" message in Channel (#1231)
2019-12-09 16:18 +0100 Fabrice Drouin       o Add a configurable time-out to onchain fee provider requests (#1244)
2019-12-09 14:12 +0100 Bastien Teinturier   o Fix MPP flaky test (#1243)
2019-12-06 14:23 +0100 Pierre-Marie Padiou  o added blank lines to minimize conflicts (#1236)
2019-12-06 13:57 +0100 Pierre-Marie Padiou  o Set `akka.loglevel` to `DEBUG` (#1235)
2019-12-04 17:29 +0100 Dominique            o Fix outgoing payments order in payments overview (#1232)
2019-12-04 14:17 +0100 Pierre-Marie Padiou  o Added a 'category' in logs (#1227)
2019-12-23 15:03 +0100 dpad85              o Keep connection to peer even with no channels
2019-12-23 12:25 +0100 dpad85              o Back to development version
2019-12-05 15:17 +0100 dpad85              o Release v0.3.4-android-phoenix
2019-12-09 17:24 +0100 pm47                o peer-backup: use a tlv-ready encoding
2019-12-09 16:18 +0100 Fabrice Drouin      o Add a configurable time-out to onchain fee provider requests (#1244)
2019-12-05 19:36 +0100 pm47                o write channel state in db on restore
2019-12-05 10:58 +0100 pm47                o support phoenix features
2019-12-04 17:29 +0100 Dominique           o Fix outgoing payments order in payments overview (#1232)
2019-12-02 16:26 +0100 pm47                M─┤   Merge branch 'master' into android
2019-12-02 16:15 +0100 Bastien Teinturier   o Handle chain re-org in balance computation (#1228)
2019-12-02 11:40 +0100 Bastien Teinturier   o Fix onion codec test (#1229)
2019-12-02 11:35 +0100 Dominique            o High level payments overview method (#1225)
2019-12-02 11:06 +0100 Bastien Teinturier   o Rework truncated integers codecs (#1212)
2019-11-29 17:03 +0100 Pierre-Marie Padiou  o Extended doHandle to other messages in MultiPartHandler (#1226)
2019-11-29 10:43 +0100 Bastien Teinturier   o Avoid incoherent payment request features. (#1222)
2019-11-29 15:54 +0100 sstone              M─│─┐ Merge branch 'master' into android

To avoid issues like this, the app repository should reference the library repository as a git submodule.

As we won’t try out compiling many times the library to try and guess, we conclude this analysis with the verdict not verifiable.

Verdict Explained

Not verifiable: The provided Source Code could not be verified to match the app released on Google Play.

This verdict means that the provider did share some source code but that we could not verify that this source code matches the released app. This might be due to the source being released later than the app or due to the provided instructions on how to compile the app not being sufficient or due to the provider excluding parts from the public source code. In any case, the result is a discrepancy between the app we can create and the app we can find on GooglePlay and any discrepancy might leak your backup to the server on purpose or by accident.

As we cannot verify that the source provided is the source the app was compiled from, this category is only slightly better than closed source but for now we have hope projects come around and fix verifiability issues.

The app cannot be independently verified. If the provider puts your funds at risk on purpose or by accident, you will probably not know about the issue before people start losing money. If the provider is more criminally inclined he might have collected all the backups of all the wallets, ready to be emptied at the press of a button. The app might have a formidable track record but out of distress or change in management turns out to be evil from some point on, with nobody outside ever knowing before it is too late.