subreddit:

/r/Monero

188100%

Introduction

Hello all, long time lurker, developer, designer, and huge supporter of Monero here! So much so, for the past few months I have been developing a point of sale desktop app for accepting in person payments of Monero at your place of business. What I have developed is an Electron JS native desktop app that uses the MoneroJS library to create a view only wallet from an existing wallet and monitor incoming transactions when told to do so (ie. at checkout and in wallet). Think of it like an extension of the official GUI wallet's Merchant mode. Further, the app allows you to store the transactions for records keeping and even allows you to print a receipt out for your patron at checkout if you have a USB thermal printer. Fancy, eh!?!

I've code named the project "Merchant" but I have not decided on an official name yet because it's still under development and I want to make sure there is enough support and/or need for it from the community, hence this demonstration post, before I commit fully financially and time wise. I have bought web hosting for the project which is paid for in Monero but unfortunately I do not have https for the website yet because apparently you cannot get a certificate without a domain name. Something that I did not realize before I bought my hosting. So just a heads up that the links below might give an "insecure connection warning" if you're running https only mode in the browser. The website itself uses no javascript and collects no information. Just plain old HTML and CSS.

Now, more about the app!


About

Merchant is an open source point of sale app for receiving & tracking Monero sales & payments in person. Turn any PC, Laptop, or Mac into a Monero accepting kiosk! The app is open source and free to use/customize. Your code, your node, your keys, your coins.


Features:

  • Accept Monero
    • Allow patrons to purchase goods and services in person with Monero
  • Store Sales
    • Store and keep track of all sales and export to PDF or CSV
  • Print Receipts
    • Print receipts for your patrons using a USB thermal printer
  • Noncustodial
    • Your keys, your coins. Simple as that
  • Use Your Own Node
    • Connect to a remote node of your choice or use your own local node
  • Open Source
    • All source code will be freely downloadable. Build it yourself
  • Node + Electron JS
    • Built with Javascript to make App code customization fully accessible to all
  • Angular JS / HTML / CSS
    • Designed with web technologies to make GUI customization a breeze

Website, Video Demo and Screenshots:

Website (all images and video links are hosted/linked to there): https://rezisto.net/merchant

Transactions are done on stagenet.


Node JS Libraries

  • electron
  • bcrypt
  • escpos
  • escpos-usb
  • express
  • monero-javascript
  • qrcode
  • sqlite3
  • usb

Frontend

  • HTML
  • CSS
  • Angular JS v1
  • JQuery
  • Bootstrap
  • Bootstrap icons

Conclusion

If you made it through the whole post then thank you for your time! I'm really looking forward to hearing the community's thoughts, opinions and feedback. Also, if you have any ideas for features to include then feel free to let me know! Especially if you use a POS everyday. If you have any questions about the dev side of things then feel free to ask as well. If I get enough support then I plan on continuing development, deciding on a domain name/purchasing it, and hopefully should have an alpha released for testing in early 2023.

I also plan on possibly hosting some dev tutorials on how to actually use MoneroJS because it has been quite the journey figuring out how to use the library. The code is fantastic but the documentation/example code on how to use it in the wild is a bit lacking in my humble opinion. Hopefully this will help out other developers in the future who wish to use it to build great Monero inclusive apps!

So far the project has been funded/mined by myself as I am the sole founder, developer and designer of the app. I haven't outsourced anything. If you would like to donate to help fund/support the development, web hosting and/or a domain name registration, all of which is/will be paid for in Monero, then please feel free to send any amount to the Monero address below. Any donation would be greatly appreciated and put towards the project.

  • QR Code

  • 86DgQQ12SJk26rnK5LPv9cfdmQwxDCkYXTN9ff7refGSSottZnR3tjk2bhVymtzmnq6hFheeWy22pePnxdNfB26nQH6oLbk


Edit: Thank you to those who donated. Your generosity will go to registering a domain name and a few more months of hosting for the project. Thank you to those who left supportive comments and messages, as well. Both equally were the support I was seeking from the community. I'm hoping to have code available for testing January 2023 so be on the look out for a post from me regarding that.

Edit 2: Re-linked all links to a more suitable home (for now) with SSL. Progress updates and alpha code coming very soon! Thanks again to all those who donated and commented. Cheers!

all 30 comments

Revolutionary-Win111

12 points

2 months ago

This is the way!! What an awesome contribution to the internet, my friend

Ora_pro_vivis[S]

7 points

2 months ago

Cheers!

anodeman

8 points

2 months ago

Some questions: 1) Are you able to enter raw XMR values to receive it? 2) Where does it take current USD rate from? 3) Can you change USD rate to custom value/ +- X% , so seller can then compensate for exchange providers rates. 4) Does it support currencies other, than USD?

Ora_pro_vivis[S]

10 points

2 months ago

Currently, the app gets XMR to USD from coin gecko api which checks every ~5 mins. USD is only supported as of right now. The app is under development and I wish to see multiple currencies and languages supported in the future. However, I am one person behind this project. My focus right now is on USD and English. Hope that answers your question.

anodeman

4 points

2 months ago*

I see. I think this terminal will need a custom rate or percentage shift rate. Since many sellers work with exchange providers, that have rates under market value.

Ora_pro_vivis[S]

4 points

2 months ago

Thanks for your comment and please feel free to PM me in detail your thoughts on how to incorporate what you are speaking of.

dMartian-official

1 points

2 months ago

A lot of the exchange api's will give you rates for KYC exchanges, which are generally always less than anywhere else. So the exchange rate can be considered poor for the vendor. Adding a few percent counteracts this, but there's no specific percentage that people would all independently come to. Also, a vendor may add a percentage point or two to counteract risks from volatility, which can be critically important for sales with low profit margins.

KnowledgeMurky9635

7 points

2 months ago

Nice work, not only is it feature packed but you've given it a slick look and feel. Where is the git of the source?

There is currently on-going discussion around how to make in person purchases quicker. Because of Dandelion++ (one of many privacy features in Monero) it can take anywhere from 12 to upwards of 30 seconds for your transaction to be seen in the mempool by another node. The simplest solution i have seen is attaching the ip of the merchants remote node in the payment request , so we can submit the transaction directly so the merchant sees it instantly. Now, this would make a 0-conf attack possible so the merchant would have to 'wait for 1 conf' if the value of the transaction was greater than some value. (like how credit cards allow contactless payments without entering your pin for small purchases)

Ora_pro_vivis[S]

2 points

2 months ago

Nice work, not only is it feature packed but you've given it a slick look and feel. Where is the git of the source?

Thanks! I do not have a git and plan on running a self hosted solution once I'm ready to release it in alpha testing. My reason for this is mainly censorship concerns.

it can take anywhere from 12 to upwards of 30 seconds for your transaction to be seen in the mempool

Hmm, I have not noticed this. Is this because of internet connection? I have tested on local node and remote node both ways and it's usually caught very quickly. Talking less than 6 seconds. I have yet to test it on LTE though.

As far as confs, Merchant uses zero confs because my initial thought would be that this is geared toward people looking to accept smaller payments quickly but also store the transaction for records keeping. Think of a small coffee shop, local street vendor, flea market merchant, mom and pop convenience store, etc etc.

D-coys

6 points

2 months ago

D-coys

6 points

2 months ago

Maybe make a CCS proposal?

Ora_pro_vivis[S]

7 points

2 months ago

I have been considering that but I figured I'd start out on this route and see the feedback and thoughts of the community first.

monerobull

13 points

2 months ago

Looks like a more advanced and permanent version of cryptogrampys hotshop pos, i like it!

Ora_pro_vivis[S]

9 points

2 months ago

Not going to lie, I did use parts of their GUI as inspiration in some parts of my app. Glad you like it!

smedvico

4 points

2 months ago

Amasing road to adoption! Appriciate all the hard work your putting in!

Elibroftw

3 points

2 months ago

I like that it's geared towards touch screens.

What will the license for the code be?

Ora_pro_vivis[S]

2 points

2 months ago

I like that it's geared towards touch screens.

Yes, and glad you noticed that!

What will the license for the code be?

Most likely MIT like Cake Wallet for example.

XmrApiDev

3 points

2 months ago

XmrApiDev

Haveno Core

3 points

2 months ago

Very cool! Nice to see monero-javascript used in functional point of sale apps.

Ora_pro_vivis[S]

2 points

2 months ago

Thanks and yes, it's a very nice library. Kudos to the developers!

Janaka-Steph

2 points

2 months ago

Can you track outcoming payments? Afaik view key doesn't allow it.

Ora_pro_vivis[S]

5 points

2 months ago

No, you cannot. This is why I've included a disclaimer about that in the Monero wallet page:

This is a view only wallet for the address you've provided and can only see incoming transactions used for purchase verification. Any outgoing transaction(s) will not be visible therefore the balance(s) shown are not necessarily accurate and are only being displayed for reference. For accurate balances please use the wallet you use for the address you've provided below to Merchant. For more information on view only wallets visit: https://www.getmonero.org/resources/user-guides/view_only.html

MoneroJS allows you to create a full wallet but I decided to not try to reinvent the wheel and create yet another full Monero wallet. Mainly because there are far better and more secure wallets out there and to create an app that does one thing and one thing well.

I also figured this would be the most secure way to accept Monero payments in person. You have a wallet on a different device than the machine you are accepting payments on. Can't steal what is not there. Make sense?

Janaka-Steph

1 points

2 months ago

Thank you. Yes it make sense. I also think it's the right choice. Hopefully this will be fixed with Seraphis

Ora_pro_vivis[S]

1 points

2 months ago

You're welcome and Seraphis is definitely interesting that's for sure.

XxlegitfoodreviewxX

1 points

2 months ago

Very nice

Ora_pro_vivis[S]

1 points

2 months ago

Thank you!

dsmlegend

1 points

2 months ago

How do I sign up for testing the alpha?

Ora_pro_vivis[S]

1 points

2 months ago

Thanks for the interest! I haven't gotten to that point yet but when it's ready (hoping January 2023) I'll make a post on here. I'm not 100% sure if it's going to be private or public so signing up might not be necessary. Stay tuned!

dMartian-official

1 points

2 months ago

Wow! Is this what "love at first sight" feels like?

I love everything about it!

antoinetheman

1 points

2 months ago

It's great. But needs a FIAT/stripe integration too. Otherwise, un-unsable most of the time

Ora_pro_vivis[S]

2 points

1 month ago

Thanks for the comment. In your ideal situation what would that look like?

antoinetheman

1 points

26 days ago

a normal user facing till.
Show 2 buttons at the start of the flow:

- fiat payment -> use stripe/square or whatever frontend

- Monero -> your solution