Grin++ (mobile) - Progress update thread by @davidtavarez

This Grin++ wallet for android is app?

Nice, you’re making great progress on this :+1:

I would assume that may confuse people into thinking this a custodian service.
Plus, it’s somewhat different from other wallets that allow you to create multiple accounts under one seed instead of creating and backing up new seeds for each account.


Is it possible to run a full node on mobile(no root) at the moment?

Nice! I installed the apk and it works really well. Very rapid responsiveness. It would be cool if the blinking | that indicates where text entry is occurring could be changed from the default of black to yellow or something. I needed to edit a password and couldn’t figure out where I was typing or if the text box was even selected. Really great work!

I’ve been working on the mobile with good progress so far, now it is possible to create wallets, restore it, view transactions history, view details of a transaction, the wallet balance, address, QR code and copy/ share that information. Next steps for Mobile:

  • Finalize the Sending and Receiving features.
  • Polish the UI a bit more.
  • Try to Downgrade at least API level to 28 (right now the minimum required version is 29 or Android 10).
  • Clean the code base.
  • Publish v0.1 for everyone.

grab a :popcorn: and take a :chair: 'cause this may take a while :grin:

welcome to my latest progress update, this time I want to present not just the UI but also I want to explain the user flow to give a better look on where the mobile application is right now.

booting up: after opening the application, the node is also opened in the background, it shows the progress until the node is fully synced, then the user is redirected to the login screen after syncing the node.

the first time the application runs, it could take a while… like, honestly, a lot… maybe… between 25 to 40 minutes depending on the device, but for a full node on a mobile phone I personally don’t think that is too much.

open, create or restore wallet: with grin++ users can manage multiple accounts (or wallets), this is possible also in the mobile version; from this screen users could either, open an existing wallet, create a new one or restore a wallet using a wallet seed.

if the fingerprint is available, the user should use their fingerprint to fully open the wallet after writing the password.

wallet: now, the user wallet is opened; the first tab shows the basic information of the wallet’s balance: spendable coins, immature, unconfirmed and locked, and below that table, the in progress transactions are listed.

from the second tab, users can, first, see and share their slatepack address, but more important, the user can check the availability of the wallet through tor, where green means that the wallet is reachable, of course, orange means that the wallet is not reachable at that moment and white means: I don’t know yet :man_shrugging:; this check is performed every 10 seconds.

to check the wallet availability I’m utilizing the hidden grinaddresschecker tor service and using tor as a socks5 proxy; the hidden service is hosted on a provider with 0 logs policy, therefore no ip, no request and no address is registered… also this service is paid in advanced for at least a year thanks to the donations of our beloved and wonderful grin++ users.

history: maybe the most boring screen, from here the user can see the transaction history grouped by date, click on a transaction and see the details:

status: I regret, this is the most boring one… as you can see, some basic information is displayed, including the connected peers; this information is also periodically updated.

you see? it is just another screen :sweat_smile:

now… let’s go to the main dish: sending, receiving and finalizing… grab another :popcorn:… and a :beer: or maybe :beers:… salud!

sending: after clicking on send from the first tab, a screen is displayed where the user sets the amount to send (also the max button can be used to send the maximum spendable available)

the next step is to enter the address by typing in the box or scanning a qr code.

after setting the amount, the receiver’s address and an optional message, the user confirms the transaction details and can send the transaction or cancel it, not starting the transaction.

after confirming the details, the wallet attempts to send the transaction through tor:

if it succeeds, the screen is closed, otherwise, a slatepack message is returned:

as you can see in the image above, the slatepack message can be copied to the phone clipboard or share it directly through another application… most people will say that the receiver could also read the generated qr code, but, no, the receiver won’t be able to read it correctly because that qr code isn’t properly rendered on a small screen since the slatepack message isn’t short at all (and technical details that are not worth mentioning).

scanning the qr from a desktop works perfectly, and this leads us to the next step: finalizing the transaction, which can be done from screen above.

before the sender can finalize the transaction, the receiver needs to actually receive the transaction… because the receiver’s wallet was not reachable while the sender tried to send the first time(or because of another reason), the receiver can also use grin++ to receive the transaction using the slatepack message:

from here, the receiver can paste the slatepack message from the clipboard, scan a qr code with the encoded message or type it manually (yeah, good luck with that!).

after receiving the slatepack message, the application will show the slatepack message that should be shared with the sender:

the receiver can, from here, copy the slatepack message and share it with the sender.

the sender can finalize the transaction from their screen where the first slatepack message can be shared or, by swiping to the left on the box displaying the transaction like this:

the sender could also cancel the started transaction by swiping to the right on the same box:

the transaction is then sent to the transaction history.

the end :movie_camera:


now… the credits:

  • Minimum version required: Android 9.0 (API Level 28).
  • Architecture supported: 64bit.
  • ARM: AArch64 or ARM64.
  • Minimum RAM recommended: 4GB.
  • Programming Language: C#.
  • Framework: Xamarin.Forms.
  • Source Code:

known bugs: there is a bug while trying the restore a wallet from the apk, the embedded node closes itself due (probably) to memory consumption… this bug is currently being tracked.

release date: december 2020 after fixing the bug above and some other minor details.


second part… in this part I would like to answer some probable questions and offer a personal opinion…

but before even thinking about it, no! it won’t be backwards compatibility, this application fully embraces the changes made for the next hard fork… having said that… thank you, let’s continue.

what next? well, after releasing a first version there are three big features that I would love to add:

  • coin control
  • sending/receiving using nfc…
  • a tool to overcome censorship helping users to set tor bridges.

also the desktop ui will be updated for the next hard fork and I will try to create an unified user experience… I want to take this opportunity to thank Sasha Abramovich for the feedback received and for this amazing medium post… (yes, yellow fellows, I asked some Beam friends for feedback, they have done a wonderful job).

as you all can see 2021 will be a busy year and I’m looking forward to it… I also plan to contribute to IronBelly on bringing some cool stuff available in grin++ (cough! nfc… cough! address availability…).

there are a few things that I’m kind of proud of… first, we’re a running a whole node in a mobile phone! and on a raspberry pi! I’m not sure if users would appreciate some interesting facts of the mobile app, but… I’m not storing any personally identifiable information, there is no analytics, the little information that is stored like the session token is stored encrypted, I’m adding rules to avoid that the node information like the wallets can be copied, and some others benefits of having the node running locally.

big kudos to @david for his amazing job on the grin++ node/wallet backend… when are we going declare this guy out of this world? :sweat_smile:

to wrap up, I personally believe we’ve made some really cool progress, and when I say “we” I’m referring to grin… the slatepack is a huge improvement, I think that the flow described in my previous post could be a lot better when we get rid off the (infamous) third step, maybe, at that moment I would be fully convinced that the interactivity is a feature and not a flaw :speak_no_evil:.

I love the idea of having full control of what it comes in and goes out of my wallet, but honestly, I think we can achieve way more without the third step.



Just beautiful …



Really cool! Thank you for your work!

1 Like

Amazing job!
I really dig the planned feature of using NFC to handshake (3 step transaction) or 2 step transaction since it is in no way intercept-able and is in the spirit of handshake transactions.
Especially the Chinese community will be very happy with this since they cannot easily use Tor to send slate-packs back and forth.
It feels a bit like Grin++ puts more emphasis on being a full node, full control wallet while Iron-belly will be more of an lightweight wallet. Anyhow, just the impression I get, I love both wallets.

1 Like

I think it is really nice of you to help another wallet-developer to improve his software that is an alternative to your own work :+1: I can’t wait to have the grin++ mobile wallet on my smartphone.

1 Like

great update (and overall vibes and positivity) @davidtavarez!! it’s really a pleasure keeping up with the work you’ve been doing :slightly_smiling_face:

1 Like

You’re making very fast progress, good job!

I’m glad to see people interested in the full wallet control idea. From the discussions I’ve seen, I think most of us would like to see a 2 steps interaction, so I’m sure there will be more talk about the next steps on this after the hard fork.


Is it true that if grin on wallet v4.00 after fork will be lost?
To prevent lost grin in wallet v.4 all have to upgrade to v.5?

No not true. No funds will be lost. But if you want to use your wallet, you should be on v5.0.0 or better.

Good Job David. the app is working very well on android 9. smooth and fast :rocket: this will def be a game changer for the grin community. once mining pool will start supporting slatepack, i can start receiving my payout while running a mobile node :wink:

get rid of the third step is in my opinion the next big thing to work on :crossed_fingers: :pray:

1 Like

Ready for another update??? grab a :tea: or a :coffee: because this one isn’t that exciting as my previous one :stuck_out_tongue:

  • The Restore Wallet issue was fixed, now users can properly Create and/or Restore wallets.
  • A button to Delete a wallet was added [having too many testing wallets was driving me crazy].
  • Users can now Backup their wallets [I believe that we should export an encrypted binary, I will probably dig about it].
  • A big bug with the Fingerprint on Android 9 was fixed [thanks @Mokhtar for the help testing the buggy apk] .
  • A bunch of small bugs were fixed [thanks again to @Mokhtar for the help testing the buggy apk] .
  • Before sending, the user should (if the Fingerprint is available) use the Fingerprint to confirm the Sending request.
  • The Node starts faster now since Tor is controlled by the Service.
  • The Node Agent was changed to: Grin++ (Android).

Now, there are 2 major new improvements:

  • The node is now running as a Service, this means that the allocated resources for the app are used to improve the UI interaction with the user. The app should feel light and smooth while the Operative System does the management of the Node and Tor processes.

  • 3 Actions were added to the Notification Bar:

    1. Restart: the user could restart the node manually in case that is needed.
    2. (Re)synchronize: pretty explicit, right? but if someone does not get it: this will synchronize the chain again.
    3. STOP: Isn’t it obvious? this will close the node and also, stop the Service.

Stay tuned! Grin++ for Android will be available this week! :rocket:


I got a chance to do some testing of the most recent code, and you guys are in for a real treat. This thing is slick as a whistle, super easy to use, and a lot faster and more energy efficient than I would’ve expected from a full mobile node.

I spent months trying to talk David out of building a mobile Grin++ wallet because shared nodes are anti-privacy, and building a full node on mobile seemed like an impossibly difficult task. But lucky for you all, he just said “Hold my beer.”

Well done @davidtavarez!


Support grin + + refuelling I hope niffler can also make a Phone Wallet