A cryptocurrency wallet (or crypto wallet) enables users to feasibly send, receive, and monitor their digital currency by storing private and public keys and interacting with various blockchain components. If you want to use Zcash or any other cryptocurrency, you will need to have a digital wallet.
We recommend both Jaxx and Cryptonator as great crypto wallet options. The reason why evaluated Jaxx and Cryptonator is because we wanted to make them even better. Most crypto wallets are in early phases of implementation and adoption, so we suspect that any issues found here with Jaxx and Cryptonator are likely present in other crypto wallets as well. If you’re a developer for another crypto wallet, recommend reading this case study, and checking that these issues are addressed in your wallet!
Both crypto wallets enable the user to send, receive, and exchange Zcash in an intuitive way. We found that Jaxx (v. 1.2.17) onboards its users well and is easy to setup and use, but is missing some user feedback when transactions fail. Cryptonator (v. 2.0.3) has lots of security measures such as email verification, device verification, and PIN, but this makes it hard to set up and navigate.
We first examined the application and its interface from a user experience designer’s standpoint, and give out evaluation of each screen:
|Landing screen||It shows you a list of your wallets and your balances (image). To send transactions, you need to go back a couple screens and find the appropriate menu.||It sends you to one of your wallets directly, and shows your balance, transactions, and allows you to send and receive transactions in one click. (image)|
|Send payment screen||Intuitive UI, showing all the necessary fields.(image)||Intuitive UI, showing all the necessary fields.(image)|
|Request payment screen||N/A||Allows you to copy your address, or input an amount to generate a QR code (image), a sample QR code that encodes address and send amount. (image)|
|Exchange payment screen||Not screenshot-able, but it looks okay–similar looking to the send payment screen. Doesn’t show the conversion rate or fees associated with this action.||Intuitive UI, showing conversion rates, and minimum and maximum exchange values. (image)|
|Sent transaction details||Has information about the transaction and provides a space to annotate what the transaction is for.||Has the information you need, but no space for annotations. (image)|
|Received transaction details||Has information about the transaction and provides a space to annotate what the transaction is for. (image)||Has the information you need, but no space for annotations. (image)|
|Transaction fee details||Transaction fees are listed as a separate transaction, but has minimal information about the fee. (image)||Transaction fee details are included in the sent transaction and not separately, which reduces visual clutter.|
We tested how easy it was to complete certain tasks, assuming a first time user who is trying their best to complete the task correctly:
|Installation and setup||Requires a signup account and too many user tasks–plus it was hard to verify email, account, set up pin, etc. (video)||Near flawless! Minimal options, easy, and quick. (video)|
|Sending payment||Easy to find where it is, and can send payments easily. (video)||Easy to find where it is, and can send payments easily. (video)|
|Receiving payment||No push notification that a transaction was received (although there is for sending one) and no notification in app–just a balance update. (video)||No push notification of receiving payment, no in-app notification of receiving payment–just a balance update. (video)|
|Exchanging currencies||Relatively easy to exchange (video), but if you miss the leading zero in a small number (.02 rather than 0.02), it errors out. (video)||It was unclear that you could exchange payment if you didn’t know what shapshift was (video, video, video), but otherwise okay. (video)|
Since we also wanted to see how the crypto wallets respond to users who are not successful at completing the above tasks, we manually input and toggled settings to trigger errors, and found that:
|Address input filtering||Does not filter for inputs not used for addresses. (video)||Does not filter for inputs not used for addresses. (video)|
|Address input length limit||No input length limit. (video)||No input length limit. (video)|
|Amount input filtering||Only allows numbers and a single period logically. (video)||Filters out letters, but allows +, -, multiple periods in a row. (video)|
|Amount input length limit||Does not allow the maximum length sendable in ZEC (i.e. 20999999.99999999). (video)||Does not allow the maximum length sendable in ZEC (i.e. 20999999.99999999), has a bug that resets the input field when you enter in a too-small number (i.e. .00000). (video)|
|Send to syntactically correct but invalid address||Tells user that it is an invalid Zcash address and instructs to double check the address. (video)||Silently fails, no notification or UI feedback. (video)|
|Send to syntactically invalid address||Tells user that it is an invalid Zcash address and instructs to double check the address. (video)||Silently fails, no notification or UI feedback. (video)|
|Sending payments offline||Notifies the user that it cannot send payments offline. (video)||Silently fails, no notification or UI feedback. Attempt silently disappears on next start. (video)|
|Sending too little (less than the fee or balance)||Notifies the user that the amount is too little. (video)||Looks like it’s able to send, with a confirmation dialogue and everything, but it actually never goes through. (video)|
|Sending too much (more than the balance)||Notifies the user that the amount is too much. (video)||Silently fails, no notification or UI feedback. (video)|
For all crypto wallets: think about not just what the user should input or do, but all possible inputs and interactions a user can do. And if any of those are invalid, prevent users from making mistakes by filtering inputs and disabling interactions.
For Jaxx: users are bound to make some mistakes, so help them through it. Alert users when a transaction failed to go through, and tell them what happened (the request was canceled, we will retry sending the transaction), and give them instructions on how to fix their issue if applicable (re-check your internet connection, check the address, etc).
For Cryptonator: a long and task-heavy setup process will turn away most of the users before they start using your application. Get users to the wallet first, then guide then through the security steps and verify their accounts later. A good policy is to ask them to verify their device right away, ask them to verify an account hour to a day after they create their crypto wallet, and to ask if they want to enable additional security features (PINS, key backup, etc) after a set amount of use.
We contacted both companies, and they have been receptive to the feedback. We look forward to making these, and other crypto wallets better in the future with further evaluation and testing.