v6.0.2 Release candidate (#3080)

* v6.0.2 Release candidate * v6.0.2 Release candidate * move btc ln up in the currency picker * disable bsc for swapsxyz * minor [skip ci] * hide dex/rate selection on swap screen * temp fix for evm tokens swaps icons until hive migration is done * minor [skip ci] * disable force dex providers for existing users and let them pick it from settings preference * Show bitcoin address types in swap picker (#3096) * Show bitcoin address types in swap picker * remove wrong conversion to bolt11 [skip ci] * feat: add Lightning invoice resolution and address normalization * automatically select contact wallet address based on the selected swap currency (whether it's bitcoin or lightning) * minor [skip ci] * default to bolt11 invoice for lightning swaps --------- Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com> --------- Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>

Omar Hatem committed Mar 16, 2026 at 14:21 UTC db00a0214ac1d574b9ec0985082e1d77134fe55a
52 files changed +268 -155
assets/new-ui/changelog/text/changelog_ar.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"مظهر جديد","description":"أعيد تصميمها من الألف إلى الياء"},{"icon":"nav","title":"سهولة التنقل","description":"تحسين شريط التنقل والتخطيطات والتدفقات"},{"icon":"cards","title":"تحسين إدارة الحساب","description":"أسهل من أي وقت مضى"},{"icon":"pallete","title":"تخصيص بطاقة الرصيد","description":"اجعلها لك!"},{"icon":"trans","title":"عرض المعاملات السريعة","description":""}]
\ No newline at end of file
1 +[{"title":"تحسينات الأداء","description":"تحسين أداء التطبيق وسرعته"},{"title":"إصلاحات الشوائب","description":"سحق المزيد من الأخطاء، لجعل تجربتك سلسة"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_bg.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Нов облик","description":"Преработен от нулата"},{"icon":"nav","title":"По-лесна навигация","description":"Подобрена навигационна лента, оформления и потоци"},{"icon":"cards","title":"Подобрено управление на акаунта","description":"По-лесно от всякога"},{"icon":"pallete","title":"Персонализиране на балансова карта","description":"Направи го твой!"},{"icon":"trans","title":"Изглед на бързи транзакции","description":""}]
\ No newline at end of file
1 +[{"title":"Подобрения в производителността","description":"Подобрете производителността и скоростта на приложението"},{"title":"Поправки на грешки","description":"Скуош повече грешки, за да направи вашето изживяване гладко"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_cs.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Nový vzhled","description":"Od základu předělaný"},{"icon":"nav","title":"Jednodušší navigace","description":"Vylepšený navigační panel, rozvržení a toky"},{"icon":"cards","title":"Vylepšená správa účtu","description":"Snazší než kdy jindy"},{"icon":"pallete","title":"Přizpůsobení karty zůstatku","description":"Udělejte to po svém!"},{"icon":"trans","title":"Rychlé zobrazení transakcí","description":""}]
\ No newline at end of file
1 +[{"title":"Vylepšení výkonu","description":"Zlepšete výkon a rychlost aplikace"},{"title":"Opravy chyb","description":"Squash více chyb, aby vaše zkušenosti hladké"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_de.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Neuer Look","description":"Von Grund auf neu gestaltet"},{"icon":"nav","title":"Einfachere Navigation","description":"Verbesserte Navigationsleiste, Layouts und Abläufe"},{"icon":"cards","title":"Verbesserte Kontoverwaltung","description":"Einfacher als je zuvor"},{"icon":"pallete","title":"Anpassung der Guthabenkarte","description":"Machen Sie es zu Ihrem!"},{"icon":"trans","title":"Schnelle Transaktionsansicht","description":""}]
\ No newline at end of file
1 +[{"title":"Leistungsverbesserungen","description":"Verbessern Sie die Leistung und Geschwindigkeit der App"},{"title":"Fehlerbehebungen","description":"Beseitigen Sie mehr Fehler, um Ihr Erlebnis reibungslos zu gestalten"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_en.json
+4 -21
@@ -1,27 +1,10 @@
1 [
2 {
3 - "icon": "star",
4 - "title": "New look",
5 - "description": "Redesigned from the ground up"
3 + "title": "Performance enhancements",
4 + "description": "Improve app performance and speed"
5 },
6 {
8 - "icon": "nav",
9 - "title": "Easier navigation",
10 - "description": "Improved navbar, layouts and flows"
11 - },
12 - {
13 - "icon": "cards",
14 - "title": "Improved account management",
15 - "description": "Easier than ever"
16 - },
17 - {
18 - "icon": "pallete",
19 - "title": "Balance card customization",
20 - "description": "Make it yours!"
21 - },
22 - {
23 - "icon": "trans",
24 - "title": "Quick transactions view",
25 - "description": ""
7 + "title": "Bug fixes",
8 + "description": "Squash more bugs, to make your experience smooth"
9 }
10 ]
assets/new-ui/changelog/text/changelog_es.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Nueva apariencia","description":"Rediseñado desde cero"},{"icon":"nav","title":"Navegación más fácil","description":"Barra de navegación, diseños y flujos mejorados."},{"icon":"cards","title":"Gestión de cuentas mejorada","description":"Más fácil que nunca"},{"icon":"pallete","title":"Personalización de la tarjeta de saldo","description":"¡Hazlo tuyo!"},{"icon":"trans","title":"Vista rápida de transacciones","description":""}]
\ No newline at end of file
1 +[{"title":"Mejoras de rendimiento","description":"Mejorar el rendimiento y la velocidad de la aplicación"},{"title":"Corrección de errores","description":"Elimina más errores para que tu experiencia sea fluida"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_fa.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"ظاهر جدید","description":"بازطراحی شده از پایه"},{"icon":"nav","title":"ناوبری آسان تر","description":"نوار ناوبری، طرح‌بندی‌ها و جریان‌ها بهبود یافته است"},{"icon":"cards","title":"بهبود مدیریت حساب","description":"راحت تر از همیشه"},{"icon":"pallete","title":"سفارشی سازی کارت موجودی","description":"آن را مال خودت کن!"},{"icon":"trans","title":"نمای معاملات سریع","description":""}]
\ No newline at end of file
1 +[{"title":"بهبود عملکرد","description":"بهبود عملکرد و سرعت برنامه"},{"title":"رفع اشکال","description":"اشکالات بیشتری را حل کنید تا تجربه خود را صاف کنید"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_fr.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Nouveau look","description":"Repensé de fond en comble"},{"icon":"nav","title":"Navigation plus facile","description":"Barre de navigation, mises en page et flux améliorés"},{"icon":"cards","title":"Gestion de compte améliorée","description":"Plus facile que jamais"},{"icon":"pallete","title":"Personnalisation de la carte de solde","description":"Faites-en le vôtre !"},{"icon":"trans","title":"Vue des transactions rapides","description":""}]
\ No newline at end of file
1 +[{"title":"Améliorations des performances","description":"Améliorer les performances et la vitesse des applications"},{"title":"Corrections de bugs","description":"Éliminez plus de bugs pour rendre votre expérience fluide"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_gn.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Ojehecha pyahu","description":"Ojejapo jey yvýguio"},{"icon":"nav","title":"Navegación ndahasýiva","description":"Oñemoporãve navbar, diseño ha flujo"},{"icon":"cards","title":"Oñemoporãve cuenta gestión rehegua","description":"Ndahasýive yma guarégui"},{"icon":"pallete","title":"Tarjeta de saldo personalización rehegua","description":"¡Ejapo chugui nde mba'e!"},{"icon":"trans","title":"Umi transacción pya’e jehechauka","description":""}]
\ No newline at end of file
1 +[{"title":"Ñemboguata ñembotuichave rehegua","description":"Emoporãve app rembiapo ha pya’e"},{"title":"Umi mba’e’oka ñemyatyrõ","description":"Embopupu hetave mba’e’oka, ikatu hag̃uáicha nde experiencia osẽ porã"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_ha.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Sabon kallo","description":"An sake tsara shi daga ƙasa zuwa sama"},{"icon":"nav","title":"Sauƙin kewayawa","description":"Ingantattun navbar, shimfidu da gudana"},{"icon":"cards","title":"Inganta sarrafa asusun","description":"Sauki fiye da kowane lokaci"},{"icon":"pallete","title":"Daidaiton katin ma'auni","description":"Maida shi naku!"},{"icon":"trans","title":"Duban ma'amaloli da sauri","description":""}]
\ No newline at end of file
1 +[{"title":"Ayyukan haɓakawa","description":"Inganta aikin app da sauri"},{"title":"Gyaran kwaro","description":"Squash ƙarin kwari, don sanya kwarewarku ta santsi"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_hi.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"नया रूप","description":"ज़मीन से ऊपर तक पुनः डिज़ाइन किया गया"},{"icon":"nav","title":"आसान नेविगेशन","description":"बेहतर नेवबार, लेआउट और प्रवाह"},{"icon":"cards","title":"बेहतर खाता प्रबंधन","description":"पहले से कहीं ज्यादा आसान"},{"icon":"pallete","title":"बैलेंस कार्ड अनुकूलन","description":"इसे अपना बनाएं!"},{"icon":"trans","title":"त्वरित लेनदेन दृश्य","description":""}]
\ No newline at end of file
1 +[{"title":"प्रदर्शन संवर्द्धन","description":"ऐप के प्रदर्शन और गति में सुधार करें"},{"title":"कंप्यूटर प्रोग्राम या प्रणाली में बग को दूर करना","description":"अपने अनुभव को सहज बनाने के लिए अधिक बग्स को नष्ट करें"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_hr.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Novi izgled","description":"Redizajniran iz temelja"},{"icon":"nav","title":"Lakša navigacija","description":"Poboljšana navigacijska traka, izgledi i tokovi"},{"icon":"cards","title":"Poboljšano upravljanje računom","description":"Lakše nego ikada"},{"icon":"pallete","title":"Prilagodba kartice stanja","description":"Učinite ga svojim!"},{"icon":"trans","title":"Pregled brzih transakcija","description":""}]
\ No newline at end of file
1 +[{"title":"Poboljšanja performansi","description":"Poboljšajte performanse i brzinu aplikacije"},{"title":"Ispravci grešaka","description":"Uklonite više grešaka kako bi vaše iskustvo bilo glatko"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_hy.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Նոր տեսք","description":"Վերանախագծված է ի սկզբանե"},{"icon":"nav","title":"Ավելի հեշտ նավարկություն","description":"Բարելավված navbar, դասավորություններ և հոսքեր"},{"icon":"cards","title":"Բարելավված հաշվի կառավարում","description":"Ավելի հեշտ, քան երբևէ"},{"icon":"pallete","title":"Հաշվեկշռային քարտի հարմարեցում","description":"Դարձրե՛ք այն ձերը:"},{"icon":"trans","title":"Արագ գործարքների դիտում","description":""}]
\ No newline at end of file
1 +[{"title":"Կատարման բարելավումներ","description":"Բարելավել հավելվածի կատարումը և արագությունը"},{"title":"Սխալների շտկում","description":"Դարձրեք ավելի շատ սխալներ, որպեսզի ձեր փորձը հարթ լինի"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_id.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Tampilan baru","description":"Didesain ulang dari awal"},{"icon":"nav","title":"Navigasi yang lebih mudah","description":"Peningkatan bilah navigasi, tata letak, dan alur"},{"icon":"cards","title":"Peningkatan manajemen akun","description":"Lebih mudah dari sebelumnya"},{"icon":"pallete","title":"Kustomisasi kartu saldo","description":"Jadikan itu milikmu!"},{"icon":"trans","title":"Tampilan transaksi cepat","description":""}]
\ No newline at end of file
1 +[{"title":"Peningkatan kinerja","description":"Tingkatkan kinerja dan kecepatan aplikasi"},{"title":"Perbaikan bug","description":"Hancurkan lebih banyak bug, untuk membuat pengalaman Anda lancar"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_it.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Nuovo aspetto","description":"Riprogettato da zero"},{"icon":"nav","title":"Navigazione più semplice","description":"Barra di navigazione, layout e flussi migliorati"},{"icon":"cards","title":"Gestione dell'account migliorata","description":"Più facile che mai"},{"icon":"pallete","title":"Personalizzazione della carta saldo","description":"Rendilo tuo!"},{"icon":"trans","title":"Visualizzazione rapida delle transazioni","description":""}]
\ No newline at end of file
1 +[{"title":"Miglioramenti delle prestazioni","description":"Migliora le prestazioni e la velocità dell'app"},{"title":"Correzioni di bug","description":"Elimina più bug per rendere la tua esperienza fluida"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_ja.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"新しい外観","description":"根本から再設計"},{"icon":"nav","title":"より簡単なナビゲーション","description":"ナビゲーションバー、レイアウト、フローの改善"},{"icon":"cards","title":"アカウント管理の改善","description":"これまでよりも簡単に"},{"icon":"pallete","title":"バランスカードのカスタマイズ","description":"それをあなたのものにしてください!"},{"icon":"trans","title":"クイックトランザクションビュー","description":""}]
\ No newline at end of file
1 +[{"title":"パフォーマンスの強化","description":"アプリのパフォーマンスと速度を向上させる"},{"title":"バグ修正","description":"エクスペリエンスをスムーズにするために、より多くのバグを潰してください"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_ko.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"새로운 모습","description":"처음부터 새롭게 디자인되었습니다."},{"icon":"nav","title":"더욱 쉬워진 탐색","description":"향상된 탐색 모음, 레이아웃 및 흐름"},{"icon":"cards","title":"향상된 계정 관리","description":"그 어느 때보다 쉬워졌습니다."},{"icon":"pallete","title":"잔액 카드 사용자 정의","description":"당신의 것으로 만들어보세요!"},{"icon":"trans","title":"빠른 거래 보기","description":""}]
\ No newline at end of file
1 +[{"title":"성능 향상","description":"앱 성능 및 속도 향상"},{"title":"버그 수정","description":"더 많은 버그를 제거하여 원활한 경험을 만드세요"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_my.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"အမြင်သစ်","description":"မြေပြင်မှ ပြန်လည်ဒီဇိုင်းထုတ်ထားသည်။"},{"icon":"nav","title":"ပိုမိုလွယ်ကူသောလမ်းကြောင်း","description":"navbar၊ အပြင်အဆင်များနှင့် စီးဆင်းမှုများကို မြှင့်တင်ထားသည်။"},{"icon":"cards","title":"ပိုမိုကောင်းမွန်သော အကောင့်စီမံခန့်ခွဲမှု","description":"အရင်ကထက် ပိုလွယ်တယ်။"},{"icon":"pallete","title":"လက်ကျန်ကတ် စိတ်ကြိုက်ပြုလုပ်ခြင်း။","description":"အဲဒါကို မင်းအတွက် လုပ်ပါ။"},{"icon":"trans","title":"လျင်မြန်သော ငွေပေးငွေယူ မြင်ကွင်း","description":""}]
\ No newline at end of file
1 +[{"title":"စွမ်းဆောင်ရည်မြှင့်တင်မှုများ","description":"အက်ပ်စွမ်းဆောင်ရည်နှင့် မြန်နှုန်းကို မြှင့်တင်ပါ။"},{"title":"ချွတ်ယွင်းချက်ပြင်ဆင်မှုများ","description":"သင့်အတွေ့အကြုံကို ချောမွေ့စေရန်အတွက် နောက်ထပ် bug များကို နှိမ်နင်းပါ။"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_nl.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Nieuwe look","description":"Opnieuw ontworpen vanaf de grond af"},{"icon":"nav","title":"Gemakkelijkere navigatie","description":"Verbeterde navigatiebalk, lay-outs en stromen"},{"icon":"cards","title":"Verbeterd accountbeheer","description":"Makkelijker dan ooit"},{"icon":"pallete","title":"Aanpassing van de saldokaart","description":"Maak het de jouwe!"},{"icon":"trans","title":"Snelle transactieweergave","description":""}]
\ No newline at end of file
1 +[{"title":"Prestatieverbeteringen","description":"Verbeter de app-prestaties en snelheid"},{"title":"Bugfixes","description":"Vernietig meer bugs om uw ervaring soepel te laten verlopen"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_pl.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Nowy wygląd","description":"Przeprojektowany od podstaw"},{"icon":"nav","title":"Łatwiejsza nawigacja","description":"Ulepszony pasek nawigacyjny, układy i przepływy"},{"icon":"cards","title":"Ulepszone zarządzanie kontem","description":"Łatwiejsze niż kiedykolwiek"},{"icon":"pallete","title":"Dostosowanie karty salda","description":"Zrób to swoje!"},{"icon":"trans","title":"Szybki podgląd transakcji","description":""}]
\ No newline at end of file
1 +[{"title":"Ulepszenia wydajności","description":"Popraw wydajność i szybkość aplikacji"},{"title":"Poprawki błędów","description":"Zmiażdż więcej błędów, aby zapewnić płynność działania"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_pt.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Novo visual","description":"Redesenhado do zero"},{"icon":"nav","title":"Navegação mais fácil","description":"Barra de navegação, layouts e fluxos aprimorados"},{"icon":"cards","title":"Gerenciamento de conta aprimorado","description":"Mais fácil do que nunca"},{"icon":"pallete","title":"Personalização do cartão de saldo","description":"Faça o seu!"},{"icon":"trans","title":"Visualização rápida de transações","description":""}]
\ No newline at end of file
1 +[{"title":"Melhorias de desempenho","description":"Melhore o desempenho e a velocidade do aplicativo"},{"title":"Correções de bugs","description":"Elimine mais bugs para tornar sua experiência mais tranquila"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_ru.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Новый облик","description":"Переработан с нуля"},{"icon":"nav","title":"Упрощенная навигация","description":"Улучшенная панель навигации, макеты и потоки."},{"icon":"cards","title":"Улучшенное управление аккаунтом","description":"Легче, чем когда-либо"},{"icon":"pallete","title":"Настройка балансовой карты","description":"Сделайте это своим!"},{"icon":"trans","title":"Быстрый просмотр транзакций","description":""}]
\ No newline at end of file
1 +[{"title":"Улучшения производительности","description":"Улучшите производительность и скорость приложения"},{"title":"Исправления ошибок","description":"Устраняйте больше ошибок, чтобы сделать вашу работу более комфортной."}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_th.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"รูปลักษณ์ใหม่","description":"ออกแบบใหม่ตั้งแต่ต้นจนจบ"},{"icon":"nav","title":"การนำทางที่ง่ายขึ้น","description":"ปรับปรุงแถบนำทาง เค้าโครง และโฟลว์"},{"icon":"cards","title":"ปรับปรุงการจัดการบัญชี","description":"ง่ายกว่าที่เคย"},{"icon":"pallete","title":"การปรับแต่งการ์ดบาลานซ์","description":"ทำให้มันเป็นของคุณ!"},{"icon":"trans","title":"มุมมองธุรกรรมด่วน","description":""}]
\ No newline at end of file
1 +[{"title":"การปรับปรุงประสิทธิภาพ","description":"ปรับปรุงประสิทธิภาพและความเร็วของแอป"},{"title":"แก้ไขข้อบกพร่อง","description":"กำจัดแมลงให้มากขึ้นเพื่อทำให้ประสบการณ์ของคุณราบรื่น"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_tl.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Bagong hitsura","description":"Muling idinisenyo mula sa simula"},{"icon":"nav","title":"Mas madaling nabigasyon","description":"Pinahusay na navbar, mga layout at daloy"},{"icon":"cards","title":"Pinahusay na pamamahala ng account","description":"Mas madali kaysa dati"},{"icon":"pallete","title":"Pag-customize ng balanse ng card","description":"Gawin ito sa iyo!"},{"icon":"trans","title":"Mabilis na pagtingin sa mga transaksyon","description":""}]
\ No newline at end of file
1 +[{"title":"Mga pagpapahusay sa pagganap","description":"Pagbutihin ang pagganap at bilis ng app"},{"title":"Mga pag-aayos ng bug","description":"Mag-squash ng higit pang mga bug, para maging maayos ang iyong karanasan"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_tr.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Yeni görünüm","description":"Baştan sona yeniden tasarlandı"},{"icon":"nav","title":"Daha kolay gezinme","description":"Geliştirilmiş gezinme çubuğu, düzenler ve akışlar"},{"icon":"cards","title":"Geliştirilmiş hesap yönetimi","description":"Her zamankinden daha kolay"},{"icon":"pallete","title":"Bakiye kartı özelleştirme","description":"Senin olsun!"},{"icon":"trans","title":"Hızlı işlemler görünümü","description":""}]
\ No newline at end of file
1 +[{"title":"Performans iyileştirmeleri","description":"Uygulama performansını ve hızını artırın"},{"title":"Hata düzeltmeleri","description":"Deneyiminizi sorunsuz hale getirmek için daha fazla hatayı giderin"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_uk.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Новий вигляд","description":"Перероблено з нуля"},{"icon":"nav","title":"Простіша навігація","description":"Покращено панель навігації, макети та потоки"},{"icon":"cards","title":"Покращене керування обліковим записом","description":"Легше, ніж будь-коли"},{"icon":"pallete","title":"Налаштування картки балансу","description":"Зробіть це своїм!"},{"icon":"trans","title":"Швидкий перегляд транзакцій","description":""}]
\ No newline at end of file
1 +[{"title":"Підвищення продуктивності","description":"Покращте продуктивність і швидкість програми"},{"title":"Виправлення помилок","description":"Усуньте більше помилок, щоб ваш досвід був плавним"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_ur.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"نئی شکل","description":"زمین سے دوبارہ ڈیزائن کیا گیا۔"},{"icon":"nav","title":"آسان نیویگیشن","description":"بہتر نوبار، ترتیب اور بہاؤ"},{"icon":"cards","title":"بہتر اکاؤنٹ مینیجمنٹ","description":"پہلے سے کہیں زیادہ آسان"},{"icon":"pallete","title":"بیلنس کارڈ حسب ضرورت","description":"اسے اپنا بنائیں!"},{"icon":"trans","title":"فوری لین دین کا نظارہ","description":""}]
\ No newline at end of file
1 +[{"title":"کارکردگی میں اضافہ","description":"ایپ کی کارکردگی اور رفتار کو بہتر بنائیں"},{"title":"بگ کی اصلاحات","description":"اپنے تجربے کو ہموار بنانے کے لیے مزید کیڑے نکالیں۔"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_vi.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Giao diện mới","description":"Được thiết kế lại từ đầu"},{"icon":"nav","title":"Điều hướng dễ dàng hơn","description":"Thanh điều hướng, bố cục và luồng được cải thiện"},{"icon":"cards","title":"Cải thiện quản lý tài khoản","description":"Dễ dàng hơn bao giờ hết"},{"icon":"pallete","title":"Tùy chỉnh thẻ số dư","description":"Hãy biến nó thành của bạn!"},{"icon":"trans","title":"Xem giao dịch nhanh","description":""}]
\ No newline at end of file
1 +[{"title":"Cải tiến hiệu suất","description":"Cải thiện hiệu suất và tốc độ ứng dụng"},{"title":"Sửa lỗi","description":"Diệt nhiều lỗi hơn để giúp trải nghiệm của bạn mượt mà hơn"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_yo.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"Iwo tuntun","description":"Atunse lati ilẹ soke"},{"icon":"nav","title":"Rọrun lilọ","description":"Ilọsiwaju navbar, ipalemo ati awọn sisan"},{"icon":"cards","title":"Imudara iṣakoso akọọlẹ","description":"Rọrun ju lailai"},{"icon":"pallete","title":"Iwontunwonsi kaadi isọdi","description":"Ṣe tirẹ!"},{"icon":"trans","title":"Wiwo awọn iṣowo yarayara","description":""}]
\ No newline at end of file
1 +[{"title":"Awọn ilọsiwaju iṣẹ","description":"Ṣe ilọsiwaju iṣẹ ṣiṣe ati iyara app"},{"title":"Awọn atunṣe kokoro","description":"Squash diẹ sii awọn idun, lati jẹ ki iriri rẹ dan"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_zh-cn.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"新面貌","description":"从头开始重新设计"},{"icon":"nav","title":"更轻松的导航","description":"改进的导航栏、布局和流程"},{"icon":"cards","title":"改进账户管理","description":"比以往更容易"},{"icon":"pallete","title":"余额卡定制","description":"让它成为你的!"},{"icon":"trans","title":"快速交易视图","description":""}]
\ No newline at end of file
1 +[{"title":"性能增强","description":"提高应用程序性能和速度"},{"title":"错误修复","description":"修复更多bug,让您的体验更加流畅"}]
\ No newline at end of file
assets/new-ui/changelog/text/changelog_zh-tw.json
+1 -1
@@ -1 +1 @@
1 -[{"icon":"star","title":"新面貌","description":"從頭開始重新設計"},{"icon":"nav","title":"更輕鬆的導航","description":"改進的導覽列、佈局和流程"},{"icon":"cards","title":"改進帳戶管理","description":"比以往更容易"},{"icon":"pallete","title":"餘額卡定制","description":"讓它成為你的!"},{"icon":"trans","title":"快速交易視圖","description":""}]
\ No newline at end of file
1 +[{"title":"效能增強","description":"提高應用程式效能和速度"},{"title":"錯誤修復","description":"修復更多bug,讓您的體驗更加流暢"}]
\ No newline at end of file
cw_bitcoin/lib/bitcoin_wallet.dart
+1
@@ -151,6 +151,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
151 seedBytes: seedBytes,
152 apiKey: secrets.breezApiKey,
153 lnurlDomain: "cake.cash",
154 + cachedAddress: cachedLightningAddress,
155 );
156 }
157 } else {
cw_bitcoin/lib/electrum_wallet_addresses.dart
+33 -18
@@ -81,6 +81,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
81 mwebAddresses =
82 ObservableList<BitcoinAddressRecord>.of((initialMwebAddresses ?? []).toSet()),
83 lockedReceiveAddressByType = ObservableMap<BitcoinAddressType, String>(),
84 + lightningAddress = lightningWallet?.cachedAddress,
85 super(walletInfo) {
86 if (masterHd != null) {
87 silentAddress = SilentPaymentOwner.fromPrivateKeys(
@@ -490,6 +491,14 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
491 addressesMap[address] = 'Active - Silent Payments';
492 }
493 }
494 +
495 + if (lightningAddress != null) {
496 + if (lightningAddress != address) {
497 + addressesMap[lightningAddress!] = 'LN';
498 + } else {
499 + addressesMap[address] = 'Active - LN';
500 + }
501 + }
502 }
503
504 void addLitecoinAddressTypes() {
@@ -767,34 +776,40 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
776 Future<void> setLightningAddress(String walletName, {String newAddress = ""}) async {
777 if (lightningWallet == null) return;
778
770 - final path = await pathForWalletDir(name: walletName, type: WalletType.bitcoin);
771 - final initialized = await lightningWallet!.init(path);
779 + try {
780 + final path = await pathForWalletDir(name: walletName, type: WalletType.bitcoin);
781 + final initialized = await lightningWallet!.init(path);
782
773 - if (!initialized) {
774 - printV("Failed to initialize the lightning wallet");
775 - return;
776 - }
783 + if (!initialized) {
784 + printV("Failed to initialize the lightning wallet");
785 + return;
786 + }
787
778 - lightningAddress = await lightningWallet!.getAddress();
788 + lightningAddress = await lightningWallet!.getAddress();
789
780 - late final String username;
790 + late final String username;
791
782 - if (newAddress.isEmpty) {
783 - if (lightningAddress != null) return;
792 + if (newAddress.isEmpty) {
793 + if (lightningAddress != null) return;
794
795 final randomNumber = Random.secure().nextInt(9999);
796 final randomName = await generateName();
797 username = "${randomName.replaceAll(" ", "")}$randomNumber".toLowerCase();
788 - } else {
789 - username = newAddress;
790 - }
798 + } else {
799 + username = newAddress;
800 + }
801
792 - try {
793 - printV(username);
794 - lightningAddress = await lightningWallet!.registerAddress(username);
802 + try {
803 + printV(username);
804 + lightningAddress = await lightningWallet!.registerAddress(username);
805 + } catch (e) {
806 + printV(e);
807 + printV(username);
808 + rethrow;
809 + }
810 } catch (e) {
796 - printV(e);
797 - printV(username);
811 + // make sure lightningAddress gets initialized anyway
812 + lightningAddress ??= lightningWallet!.cachedAddress;
813 rethrow;
814 }
815 }
cw_bitcoin/lib/lightning/lightning_wallet.dart
+2 -2
@@ -77,8 +77,6 @@ class LightningWallet {
77 _eventStream ??= sdk.addEventListener().asBroadcastStream();
78 _logStream ??= initLogging().asBroadcastStream();
79
80 - await sdk.syncWallet(request: SyncWalletRequest());
81 -
80 try {
81 final logFile = File("$appPath/lightning.log")
82 ..createSync();
@@ -87,6 +85,8 @@ class LightningWallet {
85 printV(e);
86 }
87
88 + await sdk.syncWallet(request: SyncWalletRequest());
89 +
90 return true;
91 } catch (e) {
92 printV(e);
cw_core/lib/crypto_currency.dart
+1 -1
@@ -35,6 +35,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
35 static const all = [
36 CryptoCurrency.xmr,
37 CryptoCurrency.btc,
38 + CryptoCurrency.btcln,
39 CryptoCurrency.eth,
40 CryptoCurrency.ltc,
41 CryptoCurrency.doge,
@@ -83,7 +84,6 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
84 CryptoCurrency.scrt,
85 CryptoCurrency.uni,
86 CryptoCurrency.stx,
86 - CryptoCurrency.btcln,
87 CryptoCurrency.shib,
88 CryptoCurrency.aave,
89 CryptoCurrency.arb,
lib/core/lightning_invoice_service.dart new
+58
@@ -0,0 +1,58 @@
1 +import 'dart:convert';
2 +
3 +import 'package:cw_core/utils/proxy_wrapper.dart';
4 +
5 +Future<String?> getBolt11FromLightingAddress(String lightningAddress, {int amount = 0}) async {
6 + try {
7 + final uri = getURlOfLightningAddress(lightningAddress);
8 +
9 + var response = await ProxyWrapper().get(clearnetUri: uri);
10 + final responseBody =
11 + _LNURLPResponseDTO.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
12 +
13 + response =
14 + await ProxyWrapper().get(clearnetUri: Uri.parse("${responseBody.callback}?amount=$amount"));
15 +
16 + final callbackResponseBody =
17 + _LNURLPCallbackResponseDTO.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
18 +
19 + return callbackResponseBody.pr;
20 + } catch (e) {
21 + return null;
22 + }
23 +}
24 +
25 +Uri getURlOfLightningAddress(String lightningAddress) {
26 + final parts = lightningAddress.split("@");
27 +
28 + final name = parts.first;
29 + final domain = parts.last;
30 + return Uri.parse("https://$domain/.well-known/lnurlp/$name");
31 +}
32 +
33 +class _LNURLPResponseDTO {
34 + final String callback;
35 + final int maxSendable;
36 + final int minSendable;
37 + final String tag;
38 + final String metadata;
39 +
40 + const _LNURLPResponseDTO(
41 + this.callback, this.maxSendable, this.minSendable, this.tag, this.metadata);
42 +
43 + static _LNURLPResponseDTO fromJson(Map<String, dynamic> map) => _LNURLPResponseDTO(
44 + map["callback"] as String,
45 + map["maxSendable"] as int,
46 + map["minSendable"] as int,
47 + map["tag"] as String,
48 + map["metadata"] as String);
49 +}
50 +
51 +class _LNURLPCallbackResponseDTO {
52 + final String pr;
53 +
54 + const _LNURLPCallbackResponseDTO(this.pr);
55 +
56 + static _LNURLPCallbackResponseDTO fromJson(Map<String, dynamic> map) =>
57 + _LNURLPCallbackResponseDTO(map["pr"] as String);
58 +}
lib/entities/default_settings_migration.dart
+3
@@ -595,6 +595,9 @@ Future<void> defaultSettingsMigration(
595 case 60: // BalanceCardStyleSettings.cardOrder no-op (handled in sqlite.dart)
596 // Do not migrate SQLite here, do that in sqlite.dart in order to prevent runtime
597 // errors, missing row and missing tables.
598 + case 61:
599 + // reset force dex option only 1 time and let users pick it from the swap settings preference
600 + await sharedPreferences.setBool(PreferencesKey.forceDecentralizedExchanges, false);
601 break;
602 default:
603 break;
lib/exchange/provider/exolix_exchange_provider.dart
+14 -5
@@ -1,6 +1,7 @@
1 import 'dart:convert';
2
3 import 'package:cake_wallet/.secrets.g.dart' as secrets;
4 +import 'package:cake_wallet/core/lightning_invoice_service.dart';
5 import 'package:cake_wallet/exchange/exchange_provider_description.dart';
6 import 'package:cake_wallet/exchange/limits.dart';
7 import 'package:cake_wallet/exchange/provider/exchange_provider.dart';
@@ -196,8 +197,8 @@ class ExolixExchangeProvider extends ExchangeProvider {
197 'coinTo': _normalizeCurrency(_overrideToCryptoCurrency(request.toCurrency, request.toAddress)),
198 'networkFrom': _networkFor(request.fromCurrency),
199 'networkTo': _networkFor(request.toCurrency),
199 - 'withdrawalAddress': _normalizeAddress(request.toAddress),
200 - 'refundAddress': _normalizeAddress(request.refundAddress),
200 + 'withdrawalAddress': await _normalizeAddress(request.toAddress),
201 + 'refundAddress': await _normalizeAddress(request.refundAddress),
202 'rateType': _getRateType(isFixedRateMode),
203 'apiToken': apiKey,
204 };
@@ -213,7 +214,6 @@ class ExolixExchangeProvider extends ExchangeProvider {
214 headers: headers,
215 body: json.encode(body),
216 );
216 -
217
218 if (response.statusCode == 400) {
219 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
@@ -446,8 +446,17 @@ class ExolixExchangeProvider extends ExchangeProvider {
446 }
447 }
448
449 - String _normalizeAddress(String address) =>
450 - address.startsWith('bitcoincash:') ? address.replaceFirst('bitcoincash:', '') : address;
449 + Future<String> _normalizeAddress(String address) async {
450 + if (address.startsWith('bitcoincash:'))
451 + return address.replaceFirst('bitcoincash:', '');
452 +
453 + // Lightning addresses
454 + if(address.contains("@"))
455 + return await getBolt11FromLightingAddress(address) ?? address;
456 +
457 + return address;
458 + }
459 +
460
461 static double? _toDouble(dynamic value) {
462 if (value is int) {
lib/exchange/provider/swapsxyz_exchange_provider.dart
+2 -3
@@ -8,7 +8,6 @@ import 'package:cake_wallet/exchange/trade.dart';
8 import 'package:cake_wallet/exchange/trade_not_created_exception.dart';
9 import 'package:cake_wallet/exchange/trade_request.dart';
10 import 'package:cake_wallet/exchange/trade_state.dart';
11 -import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart';
11 import 'package:cw_core/amount_converter.dart';
12 import 'package:cw_core/utils/print_verbose.dart';
13 import 'package:cw_core/utils/proxy_wrapper.dart';
@@ -20,7 +19,7 @@ class SwapsXyzExchangeProvider extends ExchangeProvider {
19 static final List<CryptoCurrency> _notSupportedAsSourceToken = [
20 CryptoCurrency.sol,
21 ...CryptoCurrency.all.where(
23 - (c) => (c.tag ?? '').toUpperCase() == 'SOL',
22 + (c) => (c.tag ?? '').toUpperCase() == 'SOL' || c.tag == CryptoCurrency.bnb.tag,
23 ),
24 ];
25
@@ -209,7 +208,7 @@ class SwapsXyzExchangeProvider extends ExchangeProvider {
208 required bool isReceiveAmount}) async {
209 try {
210
212 - if(_notSupportedAsSourceToken.contains(from)) {
211 + if(_notSupportedAsSourceToken.contains(from) || _notSupportedAsSourceToken.contains(to)) {
212 printV(
213 'fetchRate: source token ${from.title} is not supported as source token');
214 return 0.0;
lib/exchange/provider/trocador_exchange_provider.dart
-1
@@ -7,7 +7,6 @@ import 'package:cake_wallet/exchange/provider/exchange_provider.dart';
7 import 'package:cake_wallet/exchange/trade.dart';
8 import 'package:cake_wallet/exchange/trade_request.dart';
9 import 'package:cake_wallet/exchange/trade_state.dart';
10 -import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart';
10 import 'package:cake_wallet/wallet_type_utils.dart';
11 import 'package:cw_core/utils/proxy_wrapper.dart';
12 import 'package:cw_core/crypto_currency.dart';
lib/main.dart
+1 -1
@@ -324,7 +324,7 @@ Future<void> initializeAppConfigs({bool loadWallet = true}) async {
324 payjoinSessionSource: payjoinSessionSource,
325 anonpayInvoiceInfo: anonpayInvoiceInfo,
326 havenSeedStore: havenSeedStore,
327 - initialMigrationVersion: 60,
327 + initialMigrationVersion: 61,
328 );
329 }
330
lib/new-ui/pages/swap_page.dart
+19 -20
@@ -19,7 +19,6 @@ import 'package:cake_wallet/new-ui/widgets/swap_page/swap_address_selection_moda
19 import 'package:cake_wallet/new-ui/widgets/swap_page/swap_confirm_sheet.dart';
20 import 'package:cake_wallet/new-ui/widgets/swap_page/swap_limit_popup.dart';
21 import 'package:cake_wallet/new-ui/widgets/swap_page/swap_options_page.dart';
22 -import 'package:cake_wallet/new-ui/widgets/swap_page/swap_provider_initial_preference_modal.dart';
22 import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart';
23 import 'package:cake_wallet/src/screens/exchange/widgets/present_provider_picker.dart';
24 import 'package:cake_wallet/src/screens/send/widgets/extract_address_from_parsed.dart';
@@ -45,7 +44,6 @@ import 'package:cw_core/wallet_type.dart';
44 import 'package:flutter/cupertino.dart';
45 import 'package:flutter/material.dart';
46 import 'package:flutter_mobx/flutter_mobx.dart';
48 -import 'package:flutter_svg/svg.dart';
47 import 'package:mobx/mobx.dart';
48 import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
49
@@ -98,20 +96,20 @@ class _NewSwapPageState extends State<NewSwapPage> {
96 }
97
98 WidgetsBinding.instance.addPostFrameCallback((_) {
101 - if (!widget.exchangeViewModel.decentralizedExchangesPromptDismissed) {
102 - showMaterialModalBottomSheet(
103 - context: context,
104 - backgroundColor: Colors.transparent,
105 - isDismissible: false,
106 - builder: (context) {
107 - return SwapProviderInitialPreferenceModal();
108 - }).then((val) {
109 - widget.exchangeViewModel.dismissDecentralizedExchangesPrompt();
110 - if (val is bool && val == true && !widget.exchangeViewModel.forceDecentralizedExchanges) {
111 - widget.exchangeViewModel.toggleForceDecentralizedExchanges();
112 - }
113 - });
114 - }
99 + // if (!widget.exchangeViewModel.decentralizedExchangesPromptDismissed) {
100 + // showMaterialModalBottomSheet(
101 + // context: context,
102 + // backgroundColor: Colors.transparent,
103 + // isDismissible: false,
104 + // builder: (context) {
105 + // return SwapProviderInitialPreferenceModal();
106 + // }).then((val) {
107 + // widget.exchangeViewModel.dismissDecentralizedExchangesPrompt();
108 + // if (val is bool && val == true && !widget.exchangeViewModel.forceDecentralizedExchanges) {
109 + // widget.exchangeViewModel.toggleForceDecentralizedExchanges();
110 + // }
111 + // });
112 + // }
113
114 final depositAddressController = depositKey.currentState!.addressController;
115 final depositAmountController = depositKey.currentState!.amountController;
@@ -1182,13 +1180,14 @@ class SwapAmountBoxState extends State<SwapAmountBox> {
1180 });
1181 if (res != null && res is SwapAddressSelectionResult) {
1182 if (widget.isReceiverCard) {
1183 + widget.exchangeViewModel.selectedAddressBookWallet = res.walletInfo;
1184 widget.exchangeViewModel.receiveAddress = res.address!;
1186 - if (res.walletName != null) {
1185 + if (res.walletInfo?.name != null) {
1186 if (res.accountName != null) {
1187 widget.exchangeViewModel.receiveAddressDisplayName =
1189 - "${res.walletName} → ${res.accountName}";
1188 + "${res.walletInfo!.name} → ${res.accountName}";
1189 } else {
1191 - widget.exchangeViewModel.receiveAddressDisplayName = res.walletName!;
1190 + widget.exchangeViewModel.receiveAddressDisplayName = res.walletInfo!.name;
1191 }
1192 }
1193 } else if (res.address == null || res.address!.isEmpty) {
@@ -1196,7 +1195,7 @@ class SwapAmountBoxState extends State<SwapAmountBox> {
1195 askForRefundAddress();
1196 } else {
1197 widget.exchangeViewModel.isSendFromExternal = false;
1199 - switchToDepositWallet(res.walletName!);
1198 + switchToDepositWallet(res.walletInfo!.name);
1199 }
1200 }
1201 }
lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart
+1 -1
@@ -6,7 +6,6 @@ import 'package:cake_wallet/utils/show_pop_up.dart';
6 import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
7 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
8 import 'package:flutter/material.dart';
9 -import 'package:flutter_svg/svg.dart';
9
10 class AssetsTopBar extends StatelessWidget {
11 const AssetsTopBar({
@@ -98,5 +97,6 @@ class AssetsTopBar extends StatelessWidget {
97 if (tabs[selectedTab] == S.current.history) {
98 return S.current.filters;
99 }
100 + return null;
101 }
102 }
lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart
+15 -13
@@ -70,23 +70,25 @@ class HistoryTradeTile extends StatelessWidget {
70 }
71
72 String _getIconPath(CryptoCurrency currency) {
73 - if (currency.iconPath != null) {
74 - return currency.iconPath!;
75 - }
73 + try { // temporarily until we migrate from hive to sqlite and store the full currency object
74 + if (currency.iconPath != null) {
75 + return currency.iconPath!;
76 + }
77
77 - if (currency.name.isNotEmpty) {
78 - final currencyFromName = CryptoCurrency.fromString(currency.name);
79 - if (currencyFromName.iconPath != null) {
80 - return currencyFromName.iconPath!;
78 + if (currency.name.isNotEmpty) {
79 + final currencyFromName = CryptoCurrency.fromString(currency.name);
80 + if (currencyFromName.iconPath != null) {
81 + return currencyFromName.iconPath!;
82 + }
83 }
82 - }
84
84 - if (currency.title.isNotEmpty) {
85 - final currencyFromTitle = CryptoCurrency.fromString(currency.title);
86 - if (currencyFromTitle.iconPath != null) {
87 - return currencyFromTitle.iconPath!;
85 + if (currency.title.isNotEmpty) {
86 + final currencyFromTitle = CryptoCurrency.fromString(currency.title);
87 + if (currencyFromTitle.iconPath != null) {
88 + return currencyFromTitle.iconPath!;
89 + }
90 }
89 - }
91 + } catch (_) {}
92
93 //TODO approporiate fallback
94 return "";
lib/new-ui/widgets/swap_page/swap_address_selection_modal.dart
+9 -9
@@ -6,16 +6,16 @@ import 'package:cake_wallet/src/widgets/new_list_row/new_simple_checkbox.dart';
6 import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
7 import 'package:cw_core/currency_for_wallet_type.dart';
8 import 'package:cw_core/wallet_info.dart';
9 +import 'package:cw_core/wallet_type.dart' show WalletType;
10 import 'package:flutter/material.dart';
10 -import 'package:flutter_svg/flutter_svg.dart';
11 import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
12
13 class SwapAddressSelectionResult {
14 String? address;
15 - String? walletName;
15 + WalletInfo? walletInfo;
16 String? accountName;
17
18 - SwapAddressSelectionResult({this.address, this.walletName, this.accountName});
18 + SwapAddressSelectionResult({this.address, this.walletInfo, this.accountName});
19 }
20
21 class SwapAddressSelectionModal extends StatefulWidget {
@@ -52,8 +52,8 @@ class _SwapAddressSelectionModalState extends State<SwapAddressSelectionModal> {
52 ? await widget.exchangeViewModel.receiveWallets
53 : await widget.exchangeViewModel.depositWallets;
54 for (final item in items) {
55 - if (item.type.toString() == "WalletType.monero") {
56 - accounts[item.id] = await widget.exchangeViewModel.addressesForWallet(item);
55 + if (item.type == WalletType.monero) {
56 + accounts[item.id] = await widget.exchangeViewModel.addressesForAccountsWallet(item);
57 }
58 }
59 setState(() {
@@ -107,10 +107,10 @@ class _SwapAddressSelectionModalState extends State<SwapAddressSelectionModal> {
107
108 final String currencyIconPath = walletTypeToCryptoCurrency(item.type).iconPath ?? "";
109
110 - final bool hasAccounts =
111 - item.type.toString() == "WalletType.monero" && widget.isSelectingReceiver;
110 + final bool hasAccounts =
111 + item.type == WalletType.monero && widget.isSelectingReceiver;
112
113 - List<WalletInfoAddressInfo>? accounts =
113 + List<WalletInfoAddressInfo>? accounts =
114 hasAccounts ? this.accounts[item.id] : null;
115
116 return Padding(
@@ -123,7 +123,7 @@ class _SwapAddressSelectionModalState extends State<SwapAddressSelectionModal> {
123 onAddressChosen: (address, accountName) {
124 Navigator.of(context).pop(SwapAddressSelectionResult(
125 address: address,
126 - walletName: item.name,
126 + walletInfo: item,
127 accountName: accountName));
128 },
129 ),
lib/store/settings_store.dart
+1 -1
@@ -716,7 +716,7 @@ abstract class SettingsStoreBase with Store {
716
717 reaction(
718 (_) => decentralizedExchangesPromptDismissed,
719 - (bool forceDecentralizedExchanges) => _sharedPreferences.setBool(
719 + (bool decentralizedExchangesPromptDismissed) => _sharedPreferences.setBool(
720 PreferencesKey.decentralizedExchangesPromptDismissed,
721 decentralizedExchangesPromptDismissed));
722
lib/view_model/exchange/exchange_view_model.dart
+31 -17
@@ -9,6 +9,8 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart';
9 import 'package:cake_wallet/core/amount_parsing_proxy.dart';
10 import 'package:cake_wallet/core/create_trade_result.dart';
11 import 'package:cake_wallet/core/fiat_conversion_service.dart';
12 +import 'package:cake_wallet/core/lightning_invoice_service.dart';
13 +import 'package:cake_wallet/core/utilities.dart';
14 import 'package:cake_wallet/core/wallet_change_listener_view_model.dart';
15 import 'package:cake_wallet/entities/calculate_fiat_amount.dart';
16 import 'package:cake_wallet/entities/exchange_api_mode.dart';
@@ -420,7 +422,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
422 return await WalletInfo.selectList("type = ?", [type!.index]);
423 }
424
423 - Future<List<WalletInfoAddressInfo>> addressesForWallet(WalletInfo wallet) async {
425 + Future<List<WalletInfoAddressInfo>> addressesForAccountsWallet(WalletInfo wallet) async {
426 final List<WalletInfoAddressInfo> ret = [];
427 final addresses = await wallet.getAddressInfos();
428 for (var list in addresses.values) {
@@ -554,6 +556,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
556 calculateForcedProviderRate();
557 }
558
559 + WalletInfo? selectedAddressBookWallet;
560 +
561 @observable
562 double forcedProviderRate = 0.0;
563
@@ -964,22 +968,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
968 }
969 }
970
967 - if (depositCurrency == CryptoCurrency.btcln &&
968 - depositAddress == wallet.walletAddresses.addressForExchange) {
969 - final invoice = await bitcoin!.getLightningInvoice(wallet, BigInt.zero);
970 - if (invoice != null) {
971 - depositAddress = invoice;
972 - }
973 - }
974 -
975 - if (receiveCurrency == CryptoCurrency.btcln &&
976 - receiveAddress == wallet.walletAddresses.addressForExchange) {
977 - final invoice = await bitcoin!.getLightningInvoice(wallet, BigInt.zero);
978 - if (invoice != null) {
979 - receiveAddress = invoice;
980 - }
981 - }
982 -
971 late final Map<double, ExchangeProvider> providers;
972 if (forcedProvider != null) {
973 providers = {forcedProviderRate: forcedProvider!};
@@ -1000,6 +988,32 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
988 }
989
990 try {
991 + if (selectedAddressBookWallet?.type == WalletType.bitcoin) {
992 + final _walletAddresses = await selectedAddressBookWallet!.getAddresses();
993 +
994 + // if receive currency is lightning pick the lightning address
995 + // if normal bitcoin, then pick the segwit address
996 + if (receiveCurrency == CryptoCurrency.btcln) {
997 + final lightningAddressOfWallet =
998 + _walletAddresses.entries.firstWhereOrNull((e) => e.value.contains("LN"))?.key;
999 + if (lightningAddressOfWallet != null) {
1000 + receiveAddress = lightningAddressOfWallet;
1001 + }
1002 + }
1003 + if (receiveCurrency == CryptoCurrency.btc) {
1004 + final segwitAddressOfWallet =
1005 + _walletAddresses.entries.firstWhereOrNull((e) => e.value.contains("P2WPKH"))?.key;
1006 + if (segwitAddressOfWallet != null) {
1007 + receiveAddress = segwitAddressOfWallet;
1008 + }
1009 + }
1010 + }
1011 +
1012 + // parse Lightning address to bolt11 invoice
1013 + if (receiveAddress.contains("@")) {
1014 + receiveAddress = await getBolt11FromLightingAddress(receiveAddress) ?? receiveAddress;
1015 + }
1016 +
1017 // snapshot of providers to avoid concurrent modification issues
1018 final providersSnapshot = providers.values.toList();
1019 final ratesSnapshot = providers.keys.toList();
lib/view_model/send/output.dart
+1 -1
@@ -109,7 +109,7 @@ abstract class OutputBase with Store {
109 if (fiatAmount.split(".").last.length <= digits) {
110 return fiatAmount;
111 }
112 - return double.parse(fiatAmount.replaceAll(",", "")).toStringAsPrecision(digits);
112 + return double.tryParse(fiatAmount.replaceAll(",", ""))?.toStringAsPrecision(digits) ?? '0.0';
113 }
114
115 @observable
scripts/android/app_env.sh
+4 -4
@@ -14,15 +14,15 @@ TYPES=($MONERO_COM $CAKEWALLET)
14 APP_ANDROID_TYPE=$1
15
16 MONERO_COM_NAME="Monero.com"
17 -MONERO_COM_VERSION="6.0.1"
18 -MONERO_COM_BUILD_NUMBER=4154
17 +MONERO_COM_VERSION="6.0.2"
18 +MONERO_COM_BUILD_NUMBER=4155
19 MONERO_COM_BUNDLE_ID="com.monero.app"
20 MONERO_COM_PACKAGE="com.monero.app"
21 MONERO_COM_SCHEME="monero.com"
22
23 CAKEWALLET_NAME="Cake Wallet"
24 -CAKEWALLET_VERSION="6.0.1"
25 -CAKEWALLET_BUILD_NUMBER=4405
24 +CAKEWALLET_VERSION="6.0.2"
25 +CAKEWALLET_BUILD_NUMBER=4406
26 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
27 CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
28 CAKEWALLET_SCHEME="cakewallet"
scripts/ios/app_env.sh
+4 -4
@@ -12,13 +12,13 @@ TYPES=($MONERO_COM $CAKEWALLET)
12 APP_IOS_TYPE=$1
13
14 MONERO_COM_NAME="Monero.com"
15 -MONERO_COM_VERSION="6.0.1"
16 -MONERO_COM_BUILD_NUMBER=159
15 +MONERO_COM_VERSION="6.0.2"
16 +MONERO_COM_BUILD_NUMBER=160
17 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
18
19 CAKEWALLET_NAME="Cake Wallet"
20 -CAKEWALLET_VERSION="6.0.1"
21 -CAKEWALLET_BUILD_NUMBER=407
20 +CAKEWALLET_VERSION="6.0.2"
21 +CAKEWALLET_BUILD_NUMBER=408
22 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
23
24
test/core/lightning_invoice_service_test.dart new
+31
@@ -0,0 +1,31 @@
1 +import "package:cake_wallet/core/lightning_invoice_service.dart";
2 +import "package:cw_core/lnurl.dart";
3 +import "package:cw_core/utils/proxy_wrapper.dart";
4 +import "package:cw_core/utils/tor/abstract.dart";
5 +import "package:flutter_test/flutter_test.dart";
6 +
7 +Future<void> main() async {
8 + CakeTor.instance = await CakeTorInstance.getInstance();
9 +
10 + group("lightning_invoice_service", () {
11 + test("Should resolve an empty Bolt11 invoice konsti@cake.cash", () async {
12 + final invoice = await getBolt11FromLightingAddress("konsti@cake.cash");
13 +
14 + expect(invoice, isNotNull);
15 + expect(isBolt11ZeroInvoice(invoice!), isTrue);
16 + });
17 +
18 + test("Should not resolve an empty Bolt11 invoice viksharma@cluborange.org", () async {
19 + final invoice = await getBolt11FromLightingAddress("viksharma@cluborange.org");
20 +
21 + expect(invoice, isNull);
22 + });
23 +
24 + test("Should resolve an Bolt11 invoice viksharma@cluborange.org", () async {
25 + final invoice =
26 + await getBolt11FromLightingAddress("viksharma@cluborange.org", amount: 1000000000);
27 +
28 + expect(invoice, isNotNull);
29 + });
30 + });
31 +}
tool/translate_changelog.dart
+3 -3
@@ -40,9 +40,9 @@ void main() async {
40 }
41
42 out.add({
43 - "icon": itemMap["icon"]! as String,
44 - "title": newTitle,
45 - "description": newDescription,
43 + if (itemMap["icon"] != null) "icon": itemMap["icon"] as String,
44 + if (itemMap["title"] != null) "title": newTitle,
45 + if (itemMap["description"] != null) "description": newDescription,
46 });
47
48 currentItem++;