Paymetheus: A Windows Bitcoin Wallet

Paymetheus screenshot

Early Paymetheus screenshot. Can you spot the bug?

The btcsuite project started out of a desire to create high quality and usable Bitcoin tools and libraries. Early on, it was decided that Go, a type-safe and portable language, would be used. Go has been a great tool for us, but one sticking point has been the area of native graphical frontends for our software. Some previous attempts were made to write GUIs in Go, but the user experience always suffered in one way or another.

We still wanted to provide a nice graphical interface to our software that a user would enjoy using. To solve this issue, we took the pragmatic approach of developing native GUIs with languages well supported by their respective operating systems.

Paymetheus is the first result of this development. It is a Bitcoin wallet for the Windows 7/8.1/10 operating systems written in C# and WPF. Paymetheus reuses much of our existing Go code by using RPC to communicate with btcwallet under the covers. Like all of our open source software, it is freely available under the ISC License.

A Clean Interface

Paymetheus intends to be a clean looking and easy to use Bitcoin wallet even for those unfamiliar with the internal workings of Bitcoin. Without disrespecting the work of many other excellent wallet developers, this is a lofty goal and not one easily met.

Based on this criteria, privacy and safety are given top priority. It can be very easy to shoot yourself in the foot using Bitcoin when you don’t know the repercussions for every action. Paymetheus tries to curb these actions by making bad practices harder than good practices.

The most notable example of this philosophy can be found in how and when Bitcoin payment addresses are displayed. For a long time, it has been considered bad practice to reuse a payment address as it hinders privacy and scalability. In Paymetheus, the only time an address from your wallet is displayed is when a new address is generated to request a payment. Generating another address clears the previously-shown one, and when inspecting an account’s transaction history, only the receiving account name is displayed next to an output that you control. Unless you went out of your way to save your receiving address or look up the transaction on some website, it should be nearly impossible for you to give out the same address to multiple parties.

In fact, the RPC API that Paymetheus uses doesn’t even send that address when fetching transaction history. Only the BIP0044 account number is included as metadata for your outputs. Which brings me to…


The existing JSON-RPC API inherited from Bitcoin Core’s wallet has many issues too numerous to list here. Rather than using this legacy API for Paymetheus, alternative RPC protocols and APIs were considered. We finally decided on gRPC for the RPC implementation and an in-house RPC API addressing issues with the legacy API.

gRPC is usable by many languages and we expect this API to be the primary interaction method for new applications built on top of btcwallet. The legacy JSON-RPC server is still around if you need it and we intend to keep this as compatible with Core’s API as possible, but it has been moved to a legacy package and we recommend using the new API when possible.

The new API described here is still under development and review and is not yet available on the btcwallet master branch. For now, this must be installed by building the grpc Git branch. The pull request for the new API can be found here.

A Reusable Codebase

We’ve received many compliments on our Bitcoin Go libraries, and we wanted to bring that same level of quality and re-usability to the Paymetheus code as well. Paymetheus is written using the Model–view–viewmodel style. This development pattern separates the concerns of the graphical layer, the core implementation, and the logic that glues both together. That underlying core implementation is written in portable C# and is intended to be reusable on any operating system, even though the full program can only run on Windows.

An Unfinished Product

Unfortunately, I can’t speak only good things about this new project. Paymetheus is still in a very early state of development and many wanted features are not yet available. Because of this, an official binary release is not being made available quite yet. Early adopters and contributors are asked to build the project from source.

Despite the early stages, we hope that what I have described sounds exciting! We are certainly looking forward to a later, more polished release in the future.

Development remains ongoing. The project source and build instructions can be found on GitHub. Be sure to watch the issue tracker as big bugs are ironed out. Stay tuned for more news and a binary release with installer later.

Leave a Reply

Your email address will not be published. Required fields are marked *

+ 1 = four