From 42c10b15c0c4bbdca2ceccaf32ac6c8f16ccc827 Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto Date: Tue, 23 Apr 2024 15:38:04 +0000 Subject: [PATCH] Unnamed Monero Wallet development --- mrcyjanek-xmruw-development.md | 102 +++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 mrcyjanek-xmruw-development.md diff --git a/mrcyjanek-xmruw-development.md b/mrcyjanek-xmruw-development.md new file mode 100644 index 0000000..5a152a7 --- /dev/null +++ b/mrcyjanek-xmruw-development.md @@ -0,0 +1,102 @@ +--- +layout: fr +title: xmruw - development of cross platform wallet +author: mrcyjanek +date: February 29, 2024 +amount: 76.68 +milestones: + - name: Month 1 + funds: 25.56 + done: + status: unfinished + - name: Month 2 + funds: 25.56 + done: + status: unfinished + - name: Month 3 + funds: 25.56 + done: + status: unfinished +payouts: + - date: + amount: + - date: + amount: + - date: + amount: +--- + +Hello! I'm mrcyjanek and I'm currently working on the Unnamed Monero Wallet (short: xmruw) that aims to be as portable as possible and as close to `wallet2_api.h` as it is reasonably possible. + +However, this project got much bigger than I initially expected and resulted in a project that is huge in size, but also has really large portability capabilities, after fighting for a couple days with Wayland implementation on SailfishOS I (with the help from Mister_Magister and NotKit) managed to run the first cryptocurrency wallet natively on SFOS ([that is available on the app store of that os](https://openrepos.net/content/mrcyjanek/unnamed-monero-wallet-xmruw)). More details and the origin story can be found in a [blog post announcing the wallet](https://www.mrcyjanek.net/p/xmruw-monero-wallet/). + +I'm developing `xmruw` with a few critical points in mind: +- There should be no database responsible for any of the monero-releated functions - so I won't accidentally do something that shouldn't be done. +- The app should be as close to `wallet2_api.h` as possible to eliminate things like overly complex state management as something that causes issues. +- Privacy should be prioritized - no external services are contacted in the app, and if there ever happens to be some external feature it will be opt-in in settings with an option to route entire traffic through Tor. +- Security is also prioritized - not only by minimizing the attack surface but also by providing features such as stealth mode (inspired by Samourai wallet) +- UX is the most critical of them all in my opinion - without the right UX, not many users are going to use a wallet, so it is my responsibility as a developer to make the wallet available on all platforms and to be appealing to users. +- As a mobile Linux enthusiast I'll also do my best to offer secure monero wallet solutions for owners of non-Android and non-iOS mobile devices + +# About + +I've decided to take the simplest path from `wallet2_api.h` to the actual wallet UI, so instead of forking m2049r/cake implementation I've decided to use `dart:ffi` to call the native functions - this made a lot of code unnecessary, and the part that was still required was mostly generated - so I call that a huge win. But not without it's own cost - I had to write a wrapper for `wallet2_api.h` that would provide C headers instead of C++ - which meant [writing a bunch of boilerplate code](https://git.mrcyjanek.net/mrcyjanek/monero_c/src/commit/abaa3a2d165577a79ce0c3fe5382b68fa260ecc1/libbridge/src/main/cpp/wallet2_api_c.cpp#L1549) and implementing a couple of dart/flutter libraries, that gave birth to the foundation of the wallet + +## Unnamed Monero Wallet (xmruw) + +[Website](https://xmruw.net), [Gitea](https://git.mrcyjanek.net/mrcyjanek/unnamed_monero_wallet), [GitHub](https://github.com/mrcyjanek/unnamed_monero_wallet), [Downloads](https://download.xmruw.net/) + +Features of the wallet include: +- Sending/Receiving monero +- Online/Offline wallet modes + - With URQR and file exports for Android/iOS + - With clipboard-based exports for QubesOS +- Embedded Tor support +- (soon) Embedded i2p support [^1] +- Stealth mode (fake calculator app that opens wallet if the correct pin is provided) +- Multiple account support +- Coin control +- Signing / Verifying of messages +- Custom themes +- Advanced settings + - Performance analysis tool for the `wallet2_api.h` functions called + - Debug information that makes development easier + - Configuration options to opt-in to experimental features (such as [background sync](https://github.com/monero-project/monero/pull/8619)) +- OpenAlias resolving +- Backup/Restore +- Historically accurate currency conversion done fully offline +- And all of the "obvious" features such as transaction list, subaddress list, wallet locking, QR code scanning, etc. + +## Scope of work + +While working on Unamed Monero Wallet, here is a non-comprehensive list of the things I want to accomplish in no particular order, as it doesn't make sense to separate some things. + +- Expanding compatibility of `monero_c` to all platforms that I have access to (Linux (glibc+musl), FreeBSD, iOS, MacOS, Windows) in an easily-reproducible way (single script and a docker environment) +- Making `xmruw` available for all platforms (and I do mean all platforms) and in app stores (including play store, self-hosted f-droid repository, apple app store, .deb, and .rpm repository). +- Implementing features desired by users, currently this includes + - periodic sync (via [background-sync](https://github.com/monero-project/monero/pull/8617)) to provide seamless experience, no matter how frequently the app is actually opened + - merchant mode + - many UI/UX improvements/changes (some of more important ones: make seed offset and its role more obvious, better backup mechanism, time-lock warn, automatic node selection) +- Work on documentation (this will be a significant task on its own, but the goal is to allow anybody to integrate monero no matter what language/framework they are using by using monero_c/monero.dart). +- Fix issues that were made along the way + - Bytewords entering an infinite loop when incorrect text is passed in + - No compatibility with Feather / ANONERO in offline mode due to lack of CBOR encoding + - Not cross-platform QR scanner [^2] + - Bad UI on desktop (not that it's bad, it is just mobile-first) + - and more, if found when developing + - sending fixes to relevant peers and upstream + +## Milestones + +Given the nebulous nature of development, I would prefer my milestones to be time-based. I prpose a milestone completion and subsequent payout once every month (after services rendered). + +In addition to the above features mentioned in the scope of work, I propose an additional deliverable of a weekly report so my progress can be verified. + +# Payment + +I'm proposing to work for 20 hours/week for `40$/hour` at a rate of `~125,14$/XMR` (according to open prices between 2024-02-17 and 2024-03-01 (date of writing) via [CoinGecko](https://www.coingecko.com/en/coins/monero/historical_data)) for 12 weeks, summing up to a total of `~76,68` XMR split into 3 payments of `25,56` XMR every 4 weeks. +At the end of each week, I'll comment a summary of what happened along the way and what tasks were done. + +[^1]: The library is there, it needs some love to be usable, cross platform and built in a reproducible fashion. + +[^2]: Camera isn't fun, especially when being cross-platform is a goal, but supporting it is critical for URQRs. This isn't a milestone on it's own, but a topic that I'll research, do some PoC and come up with a solution, especially because getting camera to work is one task, then we need to scan qr the codes (and be **very** fast at it), so this milestone is more of "explore the possibilities" and come up with a reasonable plan for future regarding cross-platform camera support.