muun / falcon Goto Github PK
View Code? Open in Web Editor NEWMuun iOS wallet
Home Page: https://muun.com
License: MIT License
Muun iOS wallet
Home Page: https://muun.com
License: MIT License
Hi there! I was trying to pay a Lightning invoice this morning, but I noticed that the camera is not working anymore for some reason.
Hardware: iPhone 13 Mini
iOS: 16.5 (20F66)
Muun version: 2.7.7 (1017)
Permissions: I double-checked my iOS settings to make sure that Camera access is allowed for Muun.
Happens 3/3 times, even after I quit the app and start over.
Please let me know if there is something else I can do to help! I'd love to be able to help further.
there doesn't seem to be any example ui in the example app.
I can send an LNURL withdrawal request using a deep link directly to Muun using something like the following "lightning:LNURL123...123". However anyone with more than one lightning wallet on iOS finds it impossible to have the URI open the correct wallet since iOS just opens the last wallet installed which supports the "lightning:" url scheme.
I can open Muun directly if I use "muun:LNURL123...123", however it doesn't process the invoice.
I think I've managed to follow the flow through your app and found that it just supports "lightning:"...
in AppDelegate.swift, the class AddressHelper tries to parse the URI:
// Deep/Universal links
func application(_ application: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:] ) -> Bool {
...
do {
let paymentIntent = try AddressHelper.parse(url.absoluteString)
...
}
}
Looking in AddressHelper.swift it'll hit parse(lnurl: raw), and then use the LibWallet Go code to try and validate:
// AddressHelper.swift
public enum AddressHelper {
static let muunScheme = "muun:"
static let bitcoinScheme = "bitcoin:"
public static func parse(_ raw: String) throws -> PaymentIntent {
if let address = try? parse(rawAddress: raw) {
return address
}
if let invoice = try? parse(rawInvoice: raw) {
return invoice
}
if let lnurl = parse(lnurl: raw) {
return lnurl
}
throw MuunError(ParseError.addressError)
}
static func parse(lnurl: String) -> PaymentIntent? {
if LibwalletLNURLValidate(lnurl) {
return .lnurlWithdraw(lnurl: lnurl)
}
return nil
}
}
In LibWallet, lnurl.go:
func LNURLValidate(qr string) bool {
return lnurl.Validate(qr)
}
Leading to the final validate and decode in lnurl.go:
func Validate(qr string) bool {
_, err := decode(qr)
return err == nil
}
func decode(qr string) (*url.URL, error) {
// handle fallback scheme
if strings.HasPrefix(qr, "http://") || strings.HasPrefix(qr, "https://") {
u, err := url.Parse(qr)
if err != nil {
return nil, err
}
qr = u.Query().Get("lightning")
} else {
// remove lightning prefix
if strings.HasPrefix(strings.ToLower(qr), "lightning:") {
qr = qr[len("lightning:"):]
}
}
u, err := lnurl.LNURLDecode(qr)
if err != nil {
return nil, err
}
return url.Parse(string(u))
}
So here I can see that this only works by removing the "lightning:" prefix, leaving the "LNURL123...123" invoice to decode.
Other wallets like BlueWallet work by allowing "bluewallet:lightning:LNURL123...123", or in the case of Wallet of Satoshi, just allowing "walletofsatoshi:LNURL123...123".
Would it be possible to allow either the "muun:" or "muun:lightning:" scheme to decode and process the invoice, so I can open Muun directly? This would allow us at THNDR Games to add support for Muun wallet for our sats prize payments on iOS.
I think one solution could literally be to add an else clause to the above, but I don't know the codebase well enough to know if this is the only place "lightning" is used
else if strings.HasPrefix(strings.ToLower(qr), "muun:lightning:") {
qr = qr[len("muun:lightning:"):]
}
As an aside, "muun:LNURL123...123" works fine with Muun on Android, so I don't know how the Apollo project version does it?
Thanks!
There are a lot of fun lightning demos I like to show people, but many of them involve scanning a QR code from the screen. For example, paying $0.50 to pay these sheep: https://twitch.tv/tanglesheep
In most wallets, you can take a screenshot, and then pick the screenshot from the QR scanner screen. Muun is lacking this which prevents a lot of these use cases unless you have a second device nearby.
Did some quick accessibility testing on iOS using Voice Control and VoiceOver, and stumbled across a few issues. The major one is that users relying on non-touch input cannot access their transaction history at all, as the button is not selectable. The other ones are minor and fixing them will help users better understand what is on the screen and what actions they can take.
My test workflow is shown in this video (for a different app, but the workflow is the same). This was a pretty quick and casual test, I did not thoroughly go over every single screen.
I would be nice if muun supports LNUrl-pay feature. This would allow sending paymets to a static QR Code or LNUrl address.
Add .ipa file (ios app) to the releases as asset at github releases & add description of the release in:
https://github.com/muun/falcon/releases
moved to
Could you add support for MacOS? iOS apps can run natively on on Mac so I don't see any reason why this shouldn't be possible.
Hi maintainers 👋 I'm not sure if this is by design and, if so, I wonder why?
Summary: replicating a wallet on a second device drops the wallet from the first device.
Steps to reproduce
Therefore it appears that Muun won't let the user have the same wallet active on more than one device.
Feature, or bug? If this is a feature, I'd love to know why.
I'd also like to know, if Muun has the ability to hose a wallet remotely, how is that a Good Thing? That's actually scary, no?
Thank you in advance for insight on this.
Suggestion: replace the haptic feedback on pin input with something much softer. Almost feels like a glitch when quickly entering the pin
This is what the Human Rights Foundation shows: https://imgur.com/a/nxkst8C . Source: https://hrf.org/donate-bitcoin
Scanning that QR code, or pasting the receiving address into Muun does not work. Adding this compatibility into Muun would be a great addition. Thanks!
Is it possible to export payments in JSON, csv or another format?
I am playing around with lnurl-withdraw and seems like some other wallet (BlueWallet) works but Muun doesn't work the way I expect it to.
I have two urls in my webapp:
Computer and my iPhone are in the same network and BlueWallet works with exactly the same server configuration.
Success endpoint just returns this:
{
"status": "OK"
}
May be Muun expects server to return something else?
Muun wallet app v2.4.1 on iPhone 12 mini iOS 15.1 (turbo channels off).
Successfully received transaction from bluewallet lightning wallet which was reported as failed on the sender's side.
19400 sats arrived to muun wallet without leaving the bluewallet.
Payment hash: cbf4213fa35896c5ad4ab373605abd6445d7c259e67fb75a434ef8e080325951
Payment preimage: Ofaa676fd8fbe34c6cdbc9bddd64438fb2d70493f6c78f1ea390c5636aea35c2
The scenario and analysis by bluewallet team is fully described in:
BlueWallet/BlueWallet#4195
If I want to pay with Lightning in webshops or brick and mortar stores it's very common to get an invoice with a timespan of 10 minutes. Within this time, the invoice should be paid, because the amount of bitcoins needed are calculated on the current Bitcoin price (the price of the products are in local currency).
When I scan such an invoice with Muun it tells me "This payment needs a longer expiration time"
and "We suggest an expiration time of 1 hour or more"
This makes Muun unsuitable to be used when paying for products in above situations. Was this time constraint intentionally?
Can this be changed so that Muun is capable of paying invoices even when the invoice almost expires?
Hi All,
Application is getting crash on launch at below code in DatabaseCoordinator. If I comment out the code. Its working. However while creating wallet: went to infinite loop or sometimes I got logged out from wallet app. Any suggestions ?
migrator.registerMigration("challenge keys format") { _ in
let fixKey = { (keyType: SecureStorage.Keys) -> () in
if try self.secureStorage.has(keyType) {
let publicKey = try self.secureStorage.get(keyType)
if publicKey.count > 33,
let stringyKey = String(data: Data(hex: publicKey), encoding: .utf8) {
try self.secureStorage.store(stringyKey, at: keyType)
}
}
}
// Crash here
try fixKey(.passwordPublicKey)
try fixKey(.recoveryCodePublicKey)
}
BITs (100 SATs) is becoming a popular bitcoin unit. It's already available on Coin Gecko and Coin Market Cap. It's a convenient denomination for a "Bitcoin checking account" because it's closer in size to dollars (which many things are priced in) than BTC or SAT. Any chance we could get BIT as an option for Bitcoin units in the wallet?
I’ve previously gone through all the steps in the “Security” pane, and now the only option is to “Create another Emergency Kit”, which only saves another PDF and does not provide a recovery code to use with it.
https://github.com/lnurl/luds/blob/luds/17.md
Boltcard and other NFC card users are able to pay with a link that starts withoutout the "lightning:" at the beginning. All IOS and Boltcard users can then use BW for NFC card payments.
www.boltcard.org --> Go to About. Compare Muun with other walletprovider
I recently did a transaction in an attempt to sweep all my funds, but in the end created a dust UTXO of ~600 satoshis.
This is bad hygiene for the UTXO set and bitcoin's blockchain.
I'd recommend the insufficient funds popup recommend an amount to prevent the creation of dust when trying to spend all of your bitcoin.
All I get when I try to send some BTC to Strike is this error message ...."this payment needs a longer expiration time". I've done this many times before problem free but this time I'm stuck without a clue what to do. It also suggests trying a smaller transaction amount but this is in the same range I always use. Just baffled. 🤔
When trying to add funds through Strike it requires the invoice to have an amount attached to it so I can't send anything to my muun wallet.
Please add the possibility to pay invoices with no amount specified.
Heya,
I'm from the Bitcoin Design community and we are major fans of your applications UX - it really is pushing the industry forward and making LN much more accessible!
One thing that would really help us designers experiment with your app, learn more about its inner workings and thus help us improve the overall UX of Bitcoin/LN alongside Muun would be the ability to run Muun in testnet mode (ideally buried in an advanced settings area as to not have noobs accidentally switch networks).
Upon test payment from CryptoQR I got the following error 'this payment needs a longer expiration time Please request a new invoice with an expiration time of at least one hour, or try scanning an invoice with a smaller amount.' Amount is ZAR 1,00 any fixes for a crypto lay-person
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.