Merge branch 'dev' of https://github.com/cake-tech/cake_wallet into CW-1529-Improved-Seed-UI

This commit is contained in:
Blazebrain
2026-09-09 14:55:06 +01:00
47 changed files with 567 additions and 86 deletions
+7 -3
View File
@@ -116,9 +116,13 @@ We have excellent user guides, which are also open-source and open for contribut
# Build Instructions
More instructions to follow
Building Cake Wallet for each platform is covered in the platform-specific guides under `docs/builds/`:
For instructions on how to build for Android: please view file `howto-build-android.md`
- [Building for Android](docs/builds/ANDROID.md)
- [Building for iOS](docs/builds/IOS.md)
- [Building for Linux](docs/builds/LINUX.md)
- [Building for macOS](docs/builds/MACOS.md)
- [Building for Windows](docs/builds/WINDOWS.md)
# Contributing
@@ -186,4 +190,4 @@ The only parts to be translated, if needed, are the values m and s after the var
---
Copyright (C) 2018-2023 Cake Labs LLC
Copyright (C) 2018-2025 Cake Labs LLC
@@ -1 +1 @@
[{"title":"تحسينات AnyPay","description":"الآن، سيؤدي لصق عنوان ما أو مسحه ضوئيًا من أي محفظة إلى توجيهك بشكل صحيح إما للتبديل أو الإرسال من المحفظة الصحيحة، والمزيد من التحسينات"},{"title":"تحسينات واجهة المستخدم","description":"تمت إضافة بعض عناصر واجهة المستخدم الجديدة خصيصًا لك"},{"title":"إصلاحات الشوائب","description":"سحق المزيد من الأخطاء"}]
[{"title":"تريزور أصلا لبيتكوين","description":"قم بإقران جهازك وتوقيع معاملات Bitcoin مباشرة في التطبيق"},{"title":"تحسينات Solana وNFTs","description":"أرسل Solana NFTs الخاصة بك، واحتفظ بالبطاقات المستوردة المحفوظة، واطلع في لمحة سريعة على تلك التي تحتوي عليها هذه المحفظة"},{"title":"تحسينات مزامنة مونيرو","description":"يستمر تقدم المزامنة في التحرك أثناء تسخين محفظتك، حتى تعرف دائمًا مكانها"},{"title":"إصلاحات الشوائب","description":"مزامنة جهات الاتصال، واختيار العقدة، وتسجيل الدخول إلى Cake Pay، والمزيد، تم سحقها جميعًا"}]
@@ -1 +1 @@
[{"title":"Подобрения на AnyPay","description":"Сега поставянето или сканирането на адрес от който и да е портфейл ще ви насочи правилно към размяна или изпращане от правилния портфейл и много повече подобрения"},{"title":"Подобрения на потребителския интерфейс","description":"Добавени са някои нови елементи на потребителския интерфейс само за вас"},{"title":"Поправки на грешки","description":"Смачкани още грешки"}]
[{"title":"Trezor първоначално за биткойн","description":"Сдвоете вашето устройство и подписвайте биткойн транзакции направо в приложението"},{"title":"Solana и подобрения на NFT","description":"Изпратете вашите Solana NFT, запазете импортираните и вижте с един поглед кои съхранява този портфейл"},{"title":"Подобрения в синхронизирането на Monero","description":"Прогресът на синхронизирането продължава да се движи, докато портфейлът ви загрява, така че винаги да знаете къде се намира"},{"title":"Поправки на грешки","description":"Синхронизиране на контакти, избор на възел, влизане в Cake Pay и други, всички смачкани"}]
@@ -1 +1 @@
[{"title":"Vylepšení AnyPay","description":"Nyní vložení nebo skenování adresy z libovolné peněženky vás správně nasměruje buď na výměnu nebo odeslání ze správné peněženky, a k mnoha dalším vylepšením"},{"title":"vylepšení uživatelského rozhraní","description":"Přidali jsme několik nových prvků uživatelského rozhraní jen pro vás"},{"title":"Opravy chyb","description":"Zmáčkl další brouky"}]
[{"title":"Trezor nativně pro bitcoiny","description":"Spárujte své zařízení a podepište bitcoinové transakce přímo v aplikaci"},{"title":"Solana a vylepšení NFT","description":"Pošlete své Solana NFT, mějte importované uložené a na první pohled uvidíte, které z nich tato peněženka obsahuje"},{"title":"Vylepšení synchronizace Monero","description":"Zatímco se vaše peněženka zahřívá, postup synchronizace se neustále pohybuje, takže vždy víte, kde se nachází"},{"title":"Opravy chyb","description":"Synchronizace kontaktů, výběr uzlů, přihlášení do Cake Pay a další, vše zmačkané"}]
@@ -1 +1 @@
[{"title":"AnyPay-Verbesserungen","description":"Wenn Sie jetzt eine Adresse aus einem beliebigen Wallet einfügen oder scannen, werden Sie direkt zum Tauschen oder Senden von dem richtigen Wallet weitergeleitet und es gibt noch viele weitere Verbesserungen"},{"title":"Verbesserungen der Benutzeroberfläche","description":"Einige neue UI-Elemente wurden speziell für Sie hinzugefügt"},{"title":"Fehlerbehebungen","description":"Weitere Bugs beseitigt"}]
[{"title":"Trezor nativ für Bitcoin","description":"Koppeln Sie Ihr Gerät und signieren Sie Bitcoin-Transaktionen direkt in der App"},{"title":"Verbesserungen bei Solana und NFTs","description":"Senden Sie Ihre Solana-NFTs, bewahren Sie importierte NFTs auf und sehen Sie auf einen Blick, welche in dieser Wallet gespeichert sind"},{"title":"Verbesserungen bei der Monero-Synchronisierung","description":"Der Synchronisierungsfortschritt läuft weiter, während sich Ihr Geldbeutel aufwärmt, sodass Sie immer wissen, wo er steht"},{"title":"Fehlerbehebungen","description":"Kontaktsynchronisierung, Knotenauswahl, Cake Pay-Anmeldung und mehr, alles gequetscht"}]
@@ -1,14 +1,18 @@
[
{
"title": "AnyPay Improvements",
"description": "Now pasting or scanning an address from any wallet will point you correctly to either swapping or sending from the correct wallet, and much more improvements"
"title": "Trezor natively for Bitcoin",
"description": "Pair your device and sign Bitcoin transactions right in the app"
},
{
"title": "UI improvements",
"description": "Added some fresh UI elements just for you"
"title": "Solana and NFTs Improvements",
"description": "Send your Solana NFTs, keep imported ones saved, and see at a glance which ones this wallet holds"
},
{
"title": "Monero sync improvements",
"description": "Sync progress keeps moving while your wallet warms up, so you always know where it stands"
},
{
"title": "Bug fixes",
"description": "Squashed more bugs"
"description": "Contact syncing, node selection, Cake Pay sign-in and more, all squashed"
}
]
@@ -1 +1 @@
[{"title":"Mejoras en cualquier pago","description":"Ahora, pegar o escanear una dirección desde cualquier billetera le indicará correctamente si desea intercambiar o enviar desde la billetera correcta, y muchas más mejoras."},{"title":"Mejoras en la interfaz de usuario","description":"Se agregaron algunos elementos nuevos de la interfaz de usuario solo para ti."},{"title":"Corrección de errores","description":"Aplastado más errores"}]
[{"title":"Trezor de forma nativa para Bitcoin","description":"Empareja tu dispositivo y firma transacciones de Bitcoin directamente en la aplicación"},{"title":"Mejoras en Solana y NFT","description":"Envíe sus NFT de Solana, guarde los importados y vea de un vistazo cuáles contiene esta billetera"},{"title":"Mejoras en la sincronización de Monero","description":"El progreso de la sincronización continúa mientras tu billetera se calienta, para que siempre sepas dónde se encuentra"},{"title":"Corrección de errores","description":"Sincronización de contactos, selección de nodos, inicio de sesión de Cake Pay y más, todo aplastado"}]
@@ -1 +1 @@
[{"title":"AnyPay Improvements","description":"اکنون چسباندن یا اسکن یک آدرس از هر کیف پولی، شما را به درستی به تعویض یا ارسال از کیف پول صحیح و پیشرفت های بسیار بیشتر راهنمایی می کند."},{"title":"بهبودهای رابط کاربری","description":"برخی از عناصر رابط کاربری جدید را فقط برای شما اضافه کرد"},{"title":"رفع اشکال","description":"اشکالات بیشتری را له کرد"}]
[{"title":"Trezor به صورت بومی برای بیت کوین","description":"دستگاه خود را جفت کنید و معاملات بیت کوین را مستقیماً در برنامه امضا کنید"},{"title":"بهبود سولانا و NFTs","description":"NFT های Solana خود را ارسال کنید، موارد وارداتی را ذخیره کنید و در یک نگاه ببینید که این کیف پول کدام یک را در خود جای می دهد."},{"title":"بهبود همگام سازی مونرو","description":"پیشرفت همگام‌سازی تا زمانی که کیف پول شما گرم می‌شود به حرکت خود ادامه می‌دهد، بنابراین همیشه می‌دانید کجا قرار دارد"},{"title":"رفع اشکال","description":"همگام‌سازی مخاطب، انتخاب گره، ورود به سیستم Cake Pay و موارد دیگر، همه له شده‌اند"}]
@@ -1 +1 @@
[{"title":"Améliorations d'AnyPay","description":"Désormais, coller ou scanner une adresse à partir de n'importe quel portefeuille vous indiquera correctement soit l'échange, soit l'envoi à partir du bon portefeuille, et bien d'autres améliorations."},{"title":"Améliorations de l'interface utilisateur","description":"Ajout de nouveaux éléments d'interface utilisateur juste pour vous"},{"title":"Corrections de bugs","description":"Écrasé plus de bugs"}]
[{"title":"Trezor nativement pour Bitcoin","description":"Associez votre appareil et signez des transactions Bitcoin directement dans l'application"},{"title":"Améliorations de Solana et des NFT","description":"Envoyez vos NFT Solana, conservez ceux importés et voyez en un coup d'œil lesquels contiennent ce portefeuille"},{"title":"Améliorations de la synchronisation Monero","description":"La progression de la synchronisation continue pendant que votre portefeuille se réchauffe, afin que vous sachiez toujours où il en est"},{"title":"Corrections de bugs","description":"Synchronisation des contacts, sélection des nœuds, connexion à Cake Pay et bien plus encore, le tout écrasé"}]
@@ -1 +1 @@
[{"title":"AnyPay Ñemyatyrõ","description":"Ko’áĝa emboja térã eescanea peteĩ dirección oimeraẽva billetera-gui nde señaláta hekopete taha’e intercambio térã emondo haĝua billetera hekopeteguágui, ha hetaiteve ñemyatyrõ"},{"title":"UI ñemyatyrõ","description":"Oñemoĩve peteĩ elemento UI pyahu ndéve g̃uarãnte"},{"title":"Umi mba’e’oka ñemyatyrõ","description":"Oñembopupu hetave mba’e’oka"}]
[{"title":"Trezor nativamente Bitcoin-pe g̃uarã","description":"Embojoaju nde tembipuru ha efirma umi transacción Bitcoin rehegua pe app-pe voi"},{"title":"Solana ha NFTs Ñemyatyrõ","description":"Emondo nde NFT Solana, eñongatu umi ojeguerúva, ha ehecha peteĩ jesarekópe mávapa oguereko ko billetera"},{"title":"Monero sincronización ñemyatyrõ","description":"Progreso sincronización rehegua osegi omýi nde billetera oñembopiro’y aja, upéicha akóinte reikuaa moõpa oĩ"},{"title":"Umi mba’e’oka ñemyatyrõ","description":"Contacto ñembojoaju, nodo jeporavo, Cake Pay jeike ha hetave, opaite oñembotapykue"}]
@@ -1 +1 @@
[{"title":"AnyBiyan Ingantawa","description":"Yanzu liƙa ko duba adireshi daga kowane walat zai nuna maka daidai ga ko dai musanya ko aikawa daga ainihin walat ɗin, da ƙarin haɓakawa."},{"title":"UI inganta","description":"An ƙara wasu sabbin abubuwan UI don ku kawai"},{"title":"Gyaran kwaro","description":"Squashed karin kwari"}]
[{"title":"Trezor na asali don Bitcoin","description":"Haɗa na'urarka kuma sanya hannu kan ma'amalar Bitcoin daidai a cikin ƙa'idar"},{"title":"Solana da NFTs Ingantawa","description":"Aika Solana NFT ɗinku, adana waɗanda aka shigo da su, sannan ku duba ɗaya daga cikin wallet ɗin."},{"title":"Monero sync inganta","description":"Ci gaban daidaitawa yana ci gaba da motsawa yayin da walat ɗin ku ke yin dumi, don haka koyaushe ku san inda yake tsaye"},{"title":"Gyaran kwaro","description":"Daidaita lamba, zaɓin kumburi, shigar da Biyan Kek da ƙari, duk an murƙushe"}]
@@ -1 +1 @@
[{"title":"AnyPay सुधार","description":"अब किसी भी वॉलेट से किसी पते को चिपकाने या स्कैन करने से आपको स्वैपिंग या सही वॉलेट से भेजने का सही संकेत मिलेगा, और भी बहुत कुछ सुधार होगा"},{"title":"यूआई सुधार","description":"केवल आपके लिए कुछ ताज़ा यूआई तत्व जोड़े गए हैं"},{"title":"कंप्यूटर प्रोग्राम या प्रणाली में बग को दूर करना","description":"अधिक कीड़ों को कुचल दिया"}]
[{"title":"ट्रेज़ोर मूल रूप से बिटकॉइन के लिए है","description":"अपने डिवाइस को पेयर करें और ऐप में ही बिटकॉइन लेनदेन पर हस्ताक्षर करें"},{"title":"सोलाना और एनएफटी सुधार","description":"अपने सोलाना एनएफटी भेजें, आयातित एनएफटी को सहेज कर रखें और एक नज़र में देखें कि इस वॉलेट में कौन से एनएफटी हैं"},{"title":"मोनेरो सिंक में सुधार","description":"जब आपका बटुआ गर्म हो जाता है तो सिंक प्रगति चलती रहती है, इसलिए आप हमेशा जानते हैं कि यह कहां खड़ा है"},{"title":"कंप्यूटर प्रोग्राम या प्रणाली में बग को दूर करना","description":"संपर्क सिंकिंग, नोड चयन, केक पे साइन-इन और बहुत कुछ, सब खत्म हो गया"}]
@@ -1 +1 @@
[{"title":"AnyPay poboljšanja","description":"Sada će vas lijepljenje ili skeniranje adrese iz bilo kojeg novčanika ispravno usmjeriti na zamjenu ili slanje iz ispravnog novčanika i još mnogo poboljšanja"},{"title":"Poboljšanja korisničkog sučelja","description":"Dodani su novi elementi korisničkog sučelja samo za vas"},{"title":"Ispravci grešaka","description":"Zgnječio još kukaca"}]
[{"title":"Trezor izvorno za Bitcoin","description":"Uparite svoj uređaj i potpisujte Bitcoin transakcije izravno u aplikaciji"},{"title":"Solana i poboljšanja NFT-a","description":"Pošaljite svoje Solana NFT-ove, sačuvajte uvezene i na prvi pogled pogledajte koje ovaj novčanik ima"},{"title":"Poboljšanja sinkronizacije Monera","description":"Napredak sinkronizacije nastavlja se kretati dok se vaš novčanik zagrijava, tako da uvijek znate gdje stoji"},{"title":"Ispravci grešaka","description":"Sinkronizacija kontakata, odabir čvora, Cake Pay prijava i više, sve zgnječeno"}]
@@ -1 +1 @@
[{"title":"AnyPay բարելավումներ","description":"Այժմ ցանկացած դրամապանակից հասցե կպցնելը կամ սկանավորումը ձեզ ճիշտ կուղղորդի՝ կա՛մ փոխանակելու, կա՛մ ճիշտ դրամապանակից ուղարկելու և շատ ավելի բարելավումներ:"},{"title":"UI բարելավումներ","description":"Ավելացրել է մի քանի թարմ UI տարրեր հենց ձեզ համար"},{"title":"Սխալների շտկում","description":"Ճզմեց ավելի շատ սխալներ"}]
[{"title":"Trezor բնիկ համար Bitcoin","description":"Զուգավորեք ձեր սարքը և ստորագրեք Bitcoin գործարքները հենց հավելվածում"},{"title":"Սոլանայի և NFT-ների բարելավումներ","description":"Ուղարկեք ձեր Solana NFT-ները, պահեք ներմուծվածները և մի հայացքով տեսեք, թե որոնք են պահում այս դրամապանակը"},{"title":"Monero-ի համաժամացման բարելավումներ","description":"Համաժամացման առաջընթացը շարունակվում է, մինչ ձեր դրամապանակը տաքանում է, այնպես որ դուք միշտ իմանաք, թե որտեղ է այն կանգնած"},{"title":"Սխալների շտկում","description":"Կոնտակտների համաժամացում, հանգույցների ընտրություն, Cake Pay-ի մուտք և ավելին, բոլորը սեղմված են"}]
@@ -1 +1 @@
[{"title":"Peningkatan AnyPay","description":"Sekarang menempelkan atau memindai alamat dari dompet mana pun akan mengarahkan Anda dengan benar untuk menukar atau mengirim dari dompet yang benar, dan banyak lagi peningkatan lainnya"},{"title":"Peningkatan UI","description":"Menambahkan beberapa elemen UI baru hanya untuk Anda"},{"title":"Perbaikan bug","description":"Membasmi lebih banyak bug"}]
[{"title":"Trezor aslinya untuk Bitcoin","description":"Pasangkan perangkat Anda dan tanda tangani transaksi Bitcoin langsung di aplikasi"},{"title":"Peningkatan Solana dan NFT","description":"Kirim NFT Solana Anda, simpan NFT yang diimpor, dan lihat sekilas mana yang disimpan dalam dompet ini"},{"title":"Peningkatan sinkronisasi Monero","description":"Kemajuan sinkronisasi terus berjalan saat dompet Anda memanas, sehingga Anda selalu tahu di mana posisinya"},{"title":"Perbaikan bug","description":"Sinkronisasi kontak, pemilihan node, proses masuk Cake Pay, dan banyak lagi, semuanya terhenti"}]
@@ -1 +1 @@
[{"title":"Miglioramenti di AnyPay","description":"Ora incollare o scansionare un indirizzo da qualsiasi portafoglio ti indicherà correttamente lo scambio o l'invio dal portafoglio corretto e molti altri miglioramenti"},{"title":"Miglioramenti dell'interfaccia utente","description":"Aggiunti alcuni nuovi elementi dell'interfaccia utente solo per te"},{"title":"Correzioni di bug","description":"Eliminati altri bug"}]
[{"title":"Trezor nativo per Bitcoin","description":"Accoppia il tuo dispositivo e firma le transazioni Bitcoin direttamente nell'app"},{"title":"Miglioramenti di Solana e NFT","description":"Invia i tuoi NFT Solana, mantieni salvati quelli importati e scopri a colpo d'occhio quali sono contenuti in questo portafoglio"},{"title":"Miglioramenti alla sincronizzazione di Monero","description":"I progressi della sincronizzazione continuano a muoversi mentre il tuo portafoglio si riscalda, così sai sempre a che punto è"},{"title":"Correzioni di bug","description":"Sincronizzazione dei contatti, selezione dei nodi, accesso a Cake Pay e altro ancora, tutto schiacciato"}]
@@ -1 +1 @@
[{"title":"AnyPayの改善","description":"任意のウォレットからアドレスを貼り付けるかスキャンすると、正しいウォレットからの交換または送信が正しく示されるようになり、さらに多くの改善が行われました。"},{"title":"UIの改善","description":"あなたのためだけにいくつかの新しい UI 要素を追加しました"},{"title":"バグ修正","description":"さらに多くのバグを潰しました"}]
[{"title":"Trezor はビットコインにネイティブ対応","description":"デバイスをペアリングして、アプリ内で直接ビットコイン取引に署名します"},{"title":"Solana と NFT の改善","description":"Solana NFT を送信し、インポートされた NFT を保存し、このウォレットにどの NFT が保持されているかを一目で確認できます"},{"title":"Monero 同期の改善","description":"ウォレットがウォームアップしている間も同期の進行状況は継続するため、ウォレットの状態を常に把握できます"},{"title":"バグ修正","description":"連絡先の同期、ノードの選択、Cake Pay のサインインなど、すべてが潰されています"}]
@@ -1 +1 @@
[{"title":"애니페이 개선","description":"이제 지갑에서 주소를 붙여넣거나 스캔하면 올바른 지갑에서 주소를 교환하거나 보내는 것을 올바르게 가리킬 수 있으며 훨씬 더 많은 개선 사항이 있습니다."},{"title":"UI 개선","description":"당신을 위한 새로운 UI 요소를 추가했습니다."},{"title":"버그 수정","description":"더 많은 버그를 해결했습니다."}]
[{"title":"기본적으로 Bitcoin용 Trezor","description":"기기를 페어링하고 앱에서 바로 비트코인 ​​거래에 서명하세요."},{"title":"솔라나 및 NFT 개선","description":"솔라나 NFT를 보내고, 가져온 NFT를 저장하고, 이 지갑에 어떤 NFT가 들어 있는지 한눈에 확인하세요"},{"title":"모네로 동기화 개선","description":"지갑이 준비되는 동안 동기화 진행이 계속 진행되므로 항상 현재 상태를 알 수 있습니다."},{"title":"버그 수정","description":"연락처 동기화, 노드 선택, Cake Pay 로그인 등이 모두 중단되었습니다."}]
@@ -1 +1 @@
[{"title":"AnyPay တိုးတက်မှုများ","description":"ယခု မည်သည့်ပိုက်ဆံအိတ်မှ လိပ်စာတစ်ခုကို ကူးထည့်ခြင်း သို့မဟုတ် စကင်န်ဖတ်ခြင်းသည် သင့်အား မှန်ကန်သောပိုက်ဆံအိတ်မှ လဲလှယ်ရန် သို့မဟုတ် ပေးပို့ခြင်းတို့ကို မှန်ကန်စွာ ညွှန်ပြပေးမည်ဖြစ်ပြီး ပိုမိုကောင်းမွန်လာစေရန်၊"},{"title":"UI တိုးတက်မှုများ","description":"သင့်အတွက်သာ လတ်ဆတ်သော UI အစိတ်အပိုင်းအချို့ကို ထည့်ထားသည်။"},{"title":"ချွတ်ယွင်းချက်ပြင်ဆင်မှုများ","description":"နောက်ထပ် ပိုးကောင်များကို နှိမ်နင်းခဲ့သည်။"}]
[{"title":"Bitcoin အတွက် မူရင်း Trezor","description":"သင့်စက်ကို တွဲချိတ်ပြီး အက်ပ်တွင် Bitcoin ငွေပေးငွေယူများကို လက်မှတ်ထိုးပါ။"},{"title":"Solana နှင့် NFTs တိုးတက်မှုများ","description":"သင်၏ Solana NFTs များကို ပေးပို့ပါ၊ တင်သွင်းထားသည့်အရာများကို သိမ်းဆည်းထားပါ၊ ဤပိုက်ဆံအိတ်တွင် မည်သည့်အရာများ ကိုင်ဆောင်ထားသည်ကို တစ်ချက်ကြည့်လိုက်ပါ။"},{"title":"Monero စင့်ခ်လုပ်ခြင်း တိုးတက်မှု","description":"သင့်ပိုက်ဆံအိတ် ပူနွေးလာချိန်တွင် စင့်ခ်လုပ်ဆောင်မှုသည် ဆက်လက်ရွေ့လျားနေသဖြင့် ၎င်းသည် မည်သည့်နေရာတွင် ရှိနေသည်ကို သင်အမြဲသိပါသည်။"},{"title":"ချွတ်ယွင်းချက်ပြင်ဆင်မှုများ","description":"အဆက်အသွယ်စင့်ခ်လုပ်ခြင်း၊ node ရွေးချယ်ခြင်း၊ Cake Pay လက်မှတ်ထိုးဝင်ခြင်းနှင့် အခြားအရာများအားလုံးကို ဖြိုခွဲလိုက်ပါပြီ။"}]
@@ -1 +1 @@
[{"title":"AnyPay-verbeteringen","description":"Als u nu een adres uit een willekeurige portemonnee plakt of scant, wordt u correct verwezen naar het wisselen of verzenden vanuit de juiste portemonnee, en nog veel meer verbeteringen"},{"title":"UI-verbeteringen","description":"Speciaal voor jou een aantal nieuwe UI-elementen toegevoegd"},{"title":"Bugfixes","description":"Nog meer bugs geplet"}]
[{"title":"Trezor oorspronkelijk voor Bitcoin","description":"Koppel uw apparaat en onderteken Bitcoin-transacties rechtstreeks in de app"},{"title":"Verbeteringen aan Solana en NFT's","description":"Verstuur uw Solana NFT's, bewaar geïmporteerde NFT's en zie in één oogopslag welke deze portemonnee bevat"},{"title":"Verbeteringen voor de synchronisatie van Monero","description":"De voortgang van de synchronisatie blijft in beweging terwijl uw portemonnee opwarmt, zodat u altijd weet waar hij aan toe is"},{"title":"Bugfixes","description":"Contactsynchronisatie, knooppuntselectie, aanmelden bij Cake Pay en meer, allemaal platgedrukt"}]
@@ -1 +1 @@
[{"title":"Ulepszenia AnyPay","description":"Teraz wklejenie lub zeskanowanie adresu z dowolnego portfela wskaże prawidłowo opcję wymiany lub wysłania z odpowiedniego portfela oraz wiele innych ulepszeń"},{"title":"Ulepszenia interfejsu użytkownika","description":"Dodano kilka świeżych elementów interfejsu użytkownika specjalnie dla Ciebie"},{"title":"Poprawki błędów","description":"Zmiażdżono więcej błędów"}]
[{"title":"Trezor natywnie dla Bitcoin","description":"Sparuj swoje urządzenie i podpisuj transakcje Bitcoin bezpośrednio w aplikacji"},{"title":"Ulepszenia Solany i NFT","description":"Wysyłaj swoje Solana NFT, przechowuj zaimportowane i od razu zobacz, które z nich przechowuje ten portfel"},{"title":"Ulepszenia synchronizacji Monero","description":"Postęp synchronizacji stale się zmienia, podczas gdy Twój portfel się nagrzewa, więc zawsze wiesz, gdzie się znajduje"},{"title":"Poprawki błędów","description":"Synchronizacja kontaktów, wybór węzła, logowanie do Cake Pay i wiele więcej – wszystko to zmiażdżone"}]
@@ -1 +1 @@
[{"title":"Melhorias no AnyPay","description":"Agora, colar ou digitalizar um endereço de qualquer carteira indicará corretamente a troca ou o envio da carteira correta e muito mais melhorias"},{"title":"Melhorias na interface do usuário","description":"Adicionados alguns novos elementos de UI só para você"},{"title":"Correções de bugs","description":"Esmagou mais bugs"}]
[{"title":"Trezor nativamente para Bitcoin","description":"Emparelhe seu dispositivo e assine transações Bitcoin diretamente no aplicativo"},{"title":"Melhorias em Solana e NFTs","description":"Envie seus NFTs Solana, mantenha salvos os importados e veja rapidamente quais esta carteira contém"},{"title":"Melhorias na sincronização do Monero","description":"O progresso da sincronização continua avançando enquanto sua carteira aquece, para que você sempre saiba onde ela está"},{"title":"Correções de bugs","description":"Sincronização de contatos, seleção de nós, login no Cake Pay e muito mais, tudo esmagado"}]
@@ -1 +1 @@
[{"title":"Улучшения AnyPay","description":"Теперь при вставке или сканировании адреса из любого кошелька вы сможете правильно выбрать обмен или отправку из правильного кошелька, а также множество других улучшений."},{"title":"Улучшения пользовательского интерфейса","description":"Специально для вас добавлено несколько свежих элементов пользовательского интерфейса."},{"title":"Исправления ошибок","description":"Устранено больше ошибок"}]
[{"title":"Trezor изначально для биткойнов","description":"Подключите свое устройство и подпишите транзакции Bitcoin прямо в приложении."},{"title":"Улучшения Соланы и NFT","description":"Отправляйте свои NFT Solana, сохраняйте импортированные и сразу смотрите, какие из них хранятся в этом кошельке."},{"title":"Улучшения синхронизации Monero","description":"Процесс синхронизации продолжается, пока ваш кошелек нагревается, поэтому вы всегда знаете, где он находится."},{"title":"Исправления ошибок","description":"Синхронизация контактов, выбор узла, вход в систему Cake Pay и многое другое — все раздавлено"}]
@@ -1 +1 @@
[{"title":"การปรับปรุง AnyPay","description":"ตอนนี้การวางหรือสแกนที่อยู่จากกระเป๋าเงินใด ๆ จะนำคุณไปสู่การแลกเปลี่ยนหรือส่งจากกระเป๋าเงินที่ถูกต้องอย่างถูกต้อง และการปรับปรุงอื่น ๆ อีกมากมาย"},{"title":"การปรับปรุง UI","description":"เพิ่มองค์ประกอบ UI ใหม่สำหรับคุณโดยเฉพาะ"},{"title":"แก้ไขข้อบกพร่อง","description":"กำจัดข้อบกพร่องเพิ่มเติม"}]
[{"title":"Trezor โดยกำเนิดสำหรับ Bitcoin","description":"จับคู่อุปกรณ์ของคุณและลงนามธุรกรรม Bitcoin ในแอป"},{"title":"การปรับปรุง Solana และ NFT","description":"ส่ง Solana NFT ของคุณ เก็บรายการที่นำเข้าบันทึกไว้ และดูได้อย่างรวดเร็วว่ากระเป๋าสตางค์นี้เก็บรายการใดบ้าง"},{"title":"การปรับปรุงการซิงค์ Monero","description":"ความคืบหน้าในการซิงค์จะดำเนินต่อไปในขณะที่กระเป๋าเงินของคุณอุ่นขึ้น ดังนั้นคุณจะรู้อยู่เสมอว่ามันอยู่ที่ไหน"},{"title":"แก้ไขข้อบกพร่อง","description":"การซิงค์ผู้ติดต่อ การเลือกโหนด การลงชื่อเข้าใช้ Cake Pay และอื่นๆ ทั้งหมดถูกแบน"}]
@@ -1 +1 @@
[{"title":"Mga Pagpapabuti ng AnyPay","description":"Ngayon, ang pag-paste o pag-scan ng isang address mula sa anumang pitaka ay ituturo sa iyo nang tama sa alinman sa pagpapalit o pagpapadala mula sa tamang pitaka, at marami pang mga pagpapabuti"},{"title":"Mga pagpapabuti ng UI","description":"Nagdagdag ng ilang sariwang elemento ng UI para lang sa iyo"},{"title":"Mga pag-aayos ng bug","description":"Nilapit ang higit pang mga bug"}]
[{"title":"Trezor natively para sa Bitcoin","description":"Ipares ang iyong device at lagdaan ang mga transaksyon sa Bitcoin sa app mismo"},{"title":"Mga Pagpapabuti ng Solana at NFT","description":"Ipadala ang iyong mga Solana NFT, panatilihing naka-save ang mga na-import, at tingnan sa isang sulyap kung alin ang hawak ng wallet na ito"},{"title":"Mga pagpapabuti sa pag-sync ng Monero","description":"Patuloy na gumagalaw ang pag-unlad ng pag-sync habang umiinit ang iyong wallet, para lagi mong alam kung saan ito nakatayo"},{"title":"Mga pag-aayos ng bug","description":"Ang pag-sync ng contact, pagpili ng node, pag-sign in sa Cake Pay at higit pa, lahat ay lapirat"}]
@@ -1 +1 @@
[{"title":"AnyPay İyileştirmeleri","description":"Artık herhangi bir cüzdandan bir adresi yapıştırmak veya taramak, sizi doğru cüzdandan değiştirmeye veya göndermeye yönlendirecek ve çok daha fazla iyileştirme yapacak"},{"title":"Kullanıcı arayüzü iyileştirmeleri","description":"Size özel bazı yeni kullanıcı arayüzü öğeleri eklendi"},{"title":"Hata düzeltmeleri","description":"Daha fazla hata giderildi"}]
[{"title":"Bitcoin için yerel olarak Trezor","description":"Cihazınızı eşleştirin ve Bitcoin işlemlerini doğrudan uygulamada imzalayın"},{"title":"Solana ve NFT İyileştirmeleri","description":"Solana NFT'lerinizi gönderin, içe aktarılanları saklayın ve bu cüzdanda hangilerinin bulunduğunu bir bakışta görün"},{"title":"Monero senkronizasyon iyileştirmeleri","description":"Cüzdanınız ısınırken senkronizasyon ilerlemesi devam eder, böylece nerede olduğunu her zaman bilirsiniz"},{"title":"Hata düzeltmeleri","description":"Kişi senkronizasyonu, düğüm seçimi, Cake Pay'de oturum açma ve daha fazlası, hepsi engellendi"}]
@@ -1 +1 @@
[{"title":"Покращення AnyPay","description":"Тепер вставлення або сканування адреси з будь-якого гаманця правильно вкаже вас на обмін або надсилання з правильного гаманця, а також багато інших покращень"},{"title":"Покращення інтерфейсу користувача","description":"Додано кілька свіжих елементів інтерфейсу спеціально для вас"},{"title":"Виправлення помилок","description":"Роздавив більше помилок"}]
[{"title":"Trezor спочатку для Bitcoin","description":"Підключіть свій пристрій і підписуйте транзакції Bitcoin прямо в додатку"},{"title":"Покращення Solana та NFT","description":"Надсилайте свої NFT Solana, зберігайте імпортовані та одразу дивіться, які з них зберігає цей гаманець"},{"title":"Покращення синхронізації Monero","description":"Процес синхронізації продовжується, поки ваш гаманець розігрівається, тож ви завжди знаєте, де він стоїть"},{"title":"Виправлення помилок","description":"Синхронізація контактів, вибір вузла, вхід у систему Cake Pay тощо – усе зіпсовано"}]
@@ -1 +1 @@
[{"title":"AnyPay میں بہتری","description":"اب کسی بھی بٹوے سے ایڈریس پیسٹ یا اسکین کرنا آپ کو صحیح بٹوے سے تبدیل کرنے یا بھیجنے کی طرف صحیح طریقے سے اشارہ کرے گا، اور بہت زیادہ بہتری"},{"title":"UI میں بہتری","description":"صرف آپ کے لیے کچھ تازہ UI عناصر شامل کیے گئے۔"},{"title":"بگ کی اصلاحات","description":"مزید کیڑے کو کچل دیا۔"}]
[{"title":"Trezor مقامی طور پر Bitcoin کے لیے","description":"اپنے آلے کو جوڑیں اور ایپ میں ہی بٹ کوائن کے لین دین پر دستخط کریں۔"},{"title":"سولانا اور NFTs میں بہتری","description":"اپنے سولانا NFTs بھیجیں، درآمد شدہ کو محفوظ رکھیں، اور ایک نظر میں دیکھیں کہ اس پرس میں کون سا ہے"},{"title":"Monero مطابقت پذیری میں بہتری","description":"آپ کے بٹوے کے گرم ہونے کے دوران مطابقت پذیری کی پیشرفت جاری رہتی ہے، لہذا آپ کو ہمیشہ معلوم ہوتا ہے کہ یہ کہاں کھڑا ہے۔"},{"title":"بگ کی اصلاحات","description":"رابطہ کی مطابقت پذیری، نوڈ کا انتخاب، کیک پے سائن ان اور بہت کچھ، سب کو کچل دیا گیا۔"}]
@@ -1 +1 @@
[{"title":"Cải tiến AnyPay","description":"Giờ đây, việc dán hoặc quét địa chỉ từ bất kỳ ví nào sẽ chỉ cho bạn cách hoán đổi hoặc gửi từ đúng ví và nhiều cải tiến hơn nữa"},{"title":"Cải tiến giao diện người dùng","description":"Đã thêm một số thành phần UI mới dành riêng cho bạn"},{"title":"Sửa lỗi","description":"Dẹp nhiều lỗi hơn"}]
[{"title":"Trezor vốn dành cho Bitcoin","description":"Ghép nối thiết bị của bạn và ký các giao dịch Bitcoin ngay trong ứng dụng"},{"title":"Cải tiến Solana và NFT","description":"Gửi NFT Solana của bạn, lưu những cái đã nhập và xem nhanh những cái nào trong ví này chứa"},{"title":"Cải tiến đồng bộ hóa Monero","description":"Tiến trình đồng bộ hóa tiếp tục di chuyển trong khi ví của bạn ấm lên, vì vậy bạn luôn biết vị trí của nó"},{"title":"Sửa lỗi","description":"Đồng bộ hóa liên hệ, chọn nút, đăng nhập Cake Pay và hơn thế nữa, tất cả đều bị nén"}]
@@ -1 +1 @@
[{"title":"Awọn ilọsiwaju AnyPay","description":"Ni bayi titọ tabi ṣiṣayẹwo adirẹsi kan lati eyikeyi apamọwọ yoo tọka si ni deede si boya paarọ tabi firanṣẹ lati apamọwọ to pe, ati awọn ilọsiwaju pupọ diẹ sii."},{"title":"UI awọn ilọsiwaju","description":"Ṣafikun diẹ ninu awọn eroja UI tuntun kan fun ọ"},{"title":"Awọn atunṣe kokoro","description":"Squashed diẹ idun"}]
[{"title":"Trezor abinibi fun Bitcoin","description":"So ẹrọ rẹ pọ ki o forukọsilẹ awọn iṣowo Bitcoin ni ọtun ninu ohun elo naa"},{"title":"Solana ati NFTs Awọn ilọsiwaju","description":"Firanṣẹ awọn NFT Solana rẹ, tọju awọn ti a ko wọle si, ki o wo ni iwo kan kini awọn ti apamọwọ yii mu"},{"title":"Monero ìsiṣẹpọ","description":"Ilọsiwaju mimuṣiṣẹpọ n tẹsiwaju lakoko ti apamọwọ rẹ n gbona, nitorinaa o mọ ibiti o duro nigbagbogbo"},{"title":"Awọn atunṣe kokoro","description":"Imuṣiṣẹpọ olubasọrọ, yiyan ipade, Wọle isanwo Cake Pay ati diẹ sii, gbogbo wọn ti fọ"}]
@@ -1 +1 @@
[{"title":"AnyPay 改进","description":"现在,从任何钱包粘贴或扫描地址将正确地指示您从正确的钱包进行交换或发送,以及更多改进"},{"title":"用户界面改进","description":"为您添加了一些新鲜的 UI 元素"},{"title":"错误修复","description":"消除了更多错误"}]
[{"title":"Trezor 原生适用于比特币","description":"配对您的设备并直接在应用程序中签署比特币交易"},{"title":"Solana 和 NFT 的改进","description":"发送您的 Solana NFT,保存导入的 NFT,并一目了然地查看该钱包包含哪些 NFT"},{"title":"门罗币同步改进","description":"当您的钱包热身时,同步进度会不断变化,因此您始终知道进展情况"},{"title":"错误修复","description":"联系人同步、节点选择、Cake Pay 登录等全部被压缩"}]
+3 -3
View File
@@ -2,7 +2,7 @@
## Important: EVM-Compatible Wallets
**If you're adding an EVM-compatible wallet (Ethereum, Polygon, Base, Arbitrum, Optimism, etc.)**, please refer to the **[Adding New L2 Network Guide](./adding_new_l2_network_guide.md)** instead. EVM wallets use a unified architecture and don't require the full setup described in this guide.
**If you're adding an EVM-compatible wallet (Ethereum, Polygon, Base, Arbitrum, Optimism, etc.)**, please refer to the **[Adding New L2 Network Guide](./ADDING_EVM_L2_WALLET_NETWORK_TYPES.md)** instead. EVM wallets use a unified architecture and don't require the full setup described in this guide.
**For EVM wallets:**
- Use `WalletType.evm` (unified type for all EVM chains)
@@ -984,7 +984,7 @@ Add:
dart run build_runner build --delete-conflicting-outputs
```
4. **EVM Wallets**: If adding an EVM-compatible wallet, use the [L2 Network Guide](./adding_new_l2_network_guide.md) instead.
4. **EVM Wallets**: If adding an EVM-compatible wallet, use the [L2 Network Guide](./ADDING_EVM_L2_WALLET_NETWORK_TYPES.md) instead.
5. **Token Support**: If your wallet supports tokens (like ERC20, SPL, TRC20):
- Add token checks in `exchange_trade_view_model.dart`
@@ -1029,4 +1029,4 @@ Add:
---
Copyright (C) 2018-2023 Cake Labs LLC
Copyright (C) 2018-2025 Cake Labs LLC
@@ -641,6 +641,13 @@ Future<void> defaultSettingsMigration(
case 70:
await _addTbbTokenToExistingSolanaWallets();
break;
case 71:
_changeExchangeProviderAvailability(
sharedPreferences,
providerName: "Swaps.XYZ",
enabled: false,
);
break;
default:
break;
}
+1 -1
View File
@@ -308,7 +308,7 @@ Future<void> initializeAppConfigs({bool loadWallet = true}) async {
payjoinSessionSource: payjoinSessionSource,
anonpayInvoiceInfo: anonpayInvoiceInfo,
havenSeedStore: havenSeedStore,
initialMigrationVersion: 70,
initialMigrationVersion: 71,
);
}
@@ -1,15 +1,20 @@
import "package:cake_wallet/new-ui/widgets/money/money_settings_cubit.dart";
import "package:cake_wallet/new-ui/widgets/money/use_base_unit_provider.dart";
import "package:cake_wallet/store/settings_store.dart";
import "package:flutter/material.dart";
import "package:flutter_bloc/flutter_bloc.dart";
class MoneySettingsProvider extends StatelessWidget {
const MoneySettingsProvider({required this.settingsStore, this.child, super.key});
const MoneySettingsProvider({required this.settingsStore, required this.child, super.key});
final Widget? child;
final Widget child;
final SettingsStore settingsStore;
@override
Widget build(BuildContext context) =>
BlocProvider(create: (_) => MoneySettingsCubit(settingsStore), child: child);
Widget build(BuildContext context) => BlocProvider(
create: (_) => MoneySettingsCubit(settingsStore),
child: BaseUnitScope(
child: child,
),
);
}
@@ -0,0 +1,63 @@
import "dart:async";
import "package:cake_wallet/new-ui/widgets/money/money_settings_cubit.dart";
import "package:cw_core/currency.dart";
import "package:flutter/widgets.dart";
import "package:flutter_bloc/flutter_bloc.dart";
/// Read-only view of the money display settings for the current subtree.
///
/// ```dart
/// final useBaseUnit = BaseUnit.useBaseUnitOf(context, CryptoCurrency.btc);
/// ```
class BaseUnit extends InheritedModel<Currency> {
const BaseUnit({required this.state, required super.child});
final MoneySettingsState state;
static bool useBaseUnitOf(BuildContext context, Currency currency) =>
InheritedModel.inheritFrom<BaseUnit>(context, aspect: currency)!.state.useBaseUnit(currency);
static String getSymbolOf(BuildContext context, Currency currency) =>
InheritedModel.inheritFrom<BaseUnit>(context, aspect: currency)!.state.getSymbol(currency);
@override
bool updateShouldNotify(BaseUnit old) =>
state.bitcoinAmountDisplayMode != old.state.bitcoinAmountDisplayMode;
@override
bool updateShouldNotifyDependent(BaseUnit old, Set<Currency> aspects) => aspects.any((c) =>
state.useBaseUnit(c) != old.state.useBaseUnit(c) ||
state.getSymbol(c) != old.state.getSymbol(c));
}
class BaseUnitScope extends StatefulWidget {
const BaseUnitScope({required this.child, super.key});
final Widget child;
@override
State<BaseUnitScope> createState() => _BaseUnitScopeState();
}
class _BaseUnitScopeState extends State<BaseUnitScope> {
late MoneySettingsState _state;
late final StreamSubscription<MoneySettingsState> _sub;
@override
void initState() {
super.initState();
final cubit = context.read<MoneySettingsCubit>();
_state = cubit.state;
_sub = cubit.stream.listen((s) => setState(() => _state = s));
}
@override
void dispose() {
_sub.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) => BaseUnit(state: _state, child: widget.child);
}
@@ -151,7 +151,7 @@ class _NFTSendPage extends BasePage {
}
Future<void> _onSendPressed(BuildContext context) async {
if (nftSendViewModel.state is IsExecutingState) {
if (nftSendViewModel.isStartingSend || nftSendViewModel.state is IsExecutingState) {
return;
}
@@ -163,18 +163,23 @@ class _NFTSendPage extends BasePage {
final destinationAddress = addressController.text.trim();
await authService.authenticateAction(
context,
conditionToDetermineIfToUse2FA: nftSendViewModel.shouldRequireTOTP2FAFor(destinationAddress),
onAuthSuccess: (isAuthenticatedSuccessfully) async {
if (!isAuthenticatedSuccessfully || !context.mounted) {
nftSendViewModel.reset();
return;
}
try {
await authService.authenticateAction(
context,
conditionToDetermineIfToUse2FA:
nftSendViewModel.shouldRequireTOTP2FAFor(destinationAddress),
onAuthSuccess: (isAuthenticatedSuccessfully) async {
if (!isAuthenticatedSuccessfully || !context.mounted) {
nftSendViewModel.reset();
return;
}
await _createAndConfirm(context, destinationAddress);
},
);
await _createAndConfirm(context, destinationAddress);
},
);
} finally {
nftSendViewModel.markSendSettled();
}
}
Future<void> _createAndConfirm(BuildContext context, String destinationAddress) async {
@@ -90,11 +90,25 @@ abstract class NFTSendViewModelBase with Store {
}
}
@action
void markSendStarted() => state = IsExecutingState();
/// Re-entrancy latch for the send button, held only while the tap handler is
/// inside [AuthService.authenticateAction].
///
/// Deliberately not [state]: the auth sheet is pushed closable, and closing it
/// pops the route without ever invoking onAuthenticationFinished, so a flag
/// that waits on the auth result would never be cleared. The caller clears
/// this in a finally instead. Once auth succeeds, createTransaction takes over
/// the guard by setting IsExecutingState synchronously.
bool _isStartingSend = false;
bool get isStartingSend => _isStartingSend;
void markSendStarted() => _isStartingSend = true;
void markSendSettled() => _isStartingSend = false;
@action
void reset() {
_isStartingSend = false;
pendingTransaction = null;
state = InitialExecutionState();
}
+5 -3
View File
@@ -907,9 +907,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
final isSendAll = outputs.any((output) => output.sendAll);
if (!isSendAll) {
final estimateTxAmountDouble = outputs.fold<double>(
0, (acc, output) => acc + (double.tryParse(output.cryptoAmount) ?? 0));
if (estimateTxAmountDouble <= 0) throw Exception('Amount must be greater than 0');
final estimateTxAmount = outputs.fold<BigInt>(
BigInt.zero, (acc, output) => acc + output.cryptoAmountMoney.amount);
if (estimateTxAmount <= BigInt.zero) {
throw Exception('Amount must be greater than 0');
}
}
pendingTransaction = await wallet.createTransaction(_credentials(provider));
+2 -2
View File
@@ -1,7 +1,7 @@
PODS:
- bitbox_flutter (0.0.1):
- FlutterMacOS
- breez_sdk_spark_flutter (0.14.0):
- breez_sdk_spark_flutter (0.23.0):
- FlutterMacOS
- connectivity_plus (0.0.1):
- FlutterMacOS
@@ -162,7 +162,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
bitbox_flutter: b3c6d3c4970b134a78a17fddef0ef429cfec2593
breez_sdk_spark_flutter: 0da35c86276ec740d938139262e198a475586548
breez_sdk_spark_flutter: 0041ddadcea42244824bdc3b436d44ecd2fa27ae
connectivity_plus: 4adf20a405e25b42b9c9f87feff8f4b6fde18a4e
cw_mweb: 4746a3b5cc5bd4afe6fadd2481c4f7b239e391d0
device_info_plus: b0fafc687fb901e2af612763340f1b0d4352f8e5
+7 -7
View File
@@ -3095,21 +3095,21 @@ packages:
source: git
version: "0.0.1"
trezor_flutter:
dependency: "direct overridden"
dependency: "direct main"
description:
path: trezor-flutter
ref: "7d27e19b7bcdcd6241df35953f9a6ec2df0c7a97"
resolved-ref: "7d27e19b7bcdcd6241df35953f9a6ec2df0c7a97"
url: "https://github.com/cake-tech/trezor-flutter.git"
ref: f5121b1f3a06000ff836da8e6e6c83f53a9fa487
resolved-ref: f5121b1f3a06000ff836da8e6e6c83f53a9fa487
url: "https://github.com/cake-tech/trezor-flutter"
source: git
version: "0.1.0"
trezor_usb_transport:
dependency: "direct overridden"
description:
path: trezor_usb_transport
ref: "7d27e19b7bcdcd6241df35953f9a6ec2df0c7a97"
resolved-ref: "7d27e19b7bcdcd6241df35953f9a6ec2df0c7a97"
url: "https://github.com/cake-tech/trezor-flutter.git"
ref: f5121b1f3a06000ff836da8e6e6c83f53a9fa487
resolved-ref: f5121b1f3a06000ff836da8e6e6c83f53a9fa487
url: "https://github.com/cake-tech/trezor-flutter"
source: git
version: "0.0.1"
tuple:
+1 -1
View File
@@ -131,7 +131,7 @@ dependencies:
trezor_flutter:
git:
url: https://github.com/cake-tech/trezor-flutter.git
ref: 7d27e19b7bcdcd6241df35953f9a6ec2df0c7a97
ref: f5121b1f3a06000ff836da8e6e6c83f53a9fa487
path: trezor-flutter
bitbox_flutter:
path: ./scripts/bitbox_flutter
+4 -4
View File
@@ -14,15 +14,15 @@ TYPES=($MONERO_COM $CAKEWALLET)
APP_ANDROID_TYPE=$1
MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="6.4.2"
MONERO_COM_BUILD_NUMBER=4167
MONERO_COM_VERSION="6.4.4"
MONERO_COM_BUILD_NUMBER=4168
MONERO_COM_BUNDLE_ID="com.monero.app"
MONERO_COM_PACKAGE="com.monero.app"
MONERO_COM_SCHEME="monero.com"
CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="6.4.3"
CAKEWALLET_BUILD_NUMBER=4423
CAKEWALLET_VERSION="6.4.4"
CAKEWALLET_BUILD_NUMBER=4424
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
CAKEWALLET_SCHEME="cakewallet"
+4 -4
View File
@@ -12,13 +12,13 @@ TYPES=($MONERO_COM $CAKEWALLET)
APP_IOS_TYPE=$1
MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="6.4.2"
MONERO_COM_BUILD_NUMBER=173
MONERO_COM_VERSION="6.4.4"
MONERO_COM_BUILD_NUMBER=174
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="6.4.3"
CAKEWALLET_BUILD_NUMBER=437
CAKEWALLET_VERSION="6.4.4"
CAKEWALLET_BUILD_NUMBER=438
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
+2 -2
View File
@@ -14,8 +14,8 @@ if [ -n "$1" ]; then
fi
CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="6.4.1"
CAKEWALLET_BUILD_NUMBER=81
CAKEWALLET_VERSION="6.4.4"
CAKEWALLET_BUILD_NUMBER=82
if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
echo "Wrong app type."
+4 -4
View File
@@ -16,13 +16,13 @@ if [ -n "$1" ]; then
fi
MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="6.4.2"
MONERO_COM_BUILD_NUMBER=83
MONERO_COM_VERSION="6.4.4"
MONERO_COM_BUILD_NUMBER=85
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="6.4.2"
CAKEWALLET_BUILD_NUMBER=151
CAKEWALLET_VERSION="6.4.4"
CAKEWALLET_BUILD_NUMBER=153
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
@@ -0,0 +1,377 @@
import "package:cake_wallet/entities/balance_display_mode.dart";
import "package:cake_wallet/entities/bitcoin_amount_display_mode.dart";
import "package:cake_wallet/new-ui/widgets/money/money_settings_cubit.dart";
import "package:cake_wallet/new-ui/widgets/money/use_base_unit_provider.dart";
import "package:cw_core/crypto_currency.dart";
import "package:cw_core/currency.dart";
import "package:flutter/material.dart";
import "package:flutter_bloc/flutter_bloc.dart";
import "package:flutter_test/flutter_test.dart";
class FakeMoneySettingsCubit extends Cubit<MoneySettingsState> implements MoneySettingsCubit {
FakeMoneySettingsCubit(super.initialState);
void setState(MoneySettingsState state) => emit(state);
}
MoneySettingsState _moneySettingsState({
BitcoinAmountDisplayMode bitcoin = BitcoinAmountDisplayMode.bitcoin,
BalanceDisplayMode display = BalanceDisplayMode.availableBalance,
}) =>
MoneySettingsState(
bitcoinAmountDisplayMode: bitcoin,
displayMode: display,
);
Future<void> _pumpEmission(WidgetTester tester) => tester.pump(Duration.zero);
class _Probe extends StatelessWidget {
const _Probe({required this.currencies, required this.log});
_Probe.single(Currency currency, {required this.log, super.key})
: currencies = <Currency>[currency];
final List<Currency> currencies;
final List<List<bool>> log;
@override
Widget build(BuildContext context) {
final observed =
currencies.map((c) => BaseUnit.useBaseUnitOf(context, c)).toList(growable: false);
log.add(observed);
return const SizedBox.shrink();
}
}
class _SymbolProbe extends StatelessWidget {
const _SymbolProbe(this.currency, this.log, {super.key});
final Currency currency;
final List<String> log;
@override
Widget build(BuildContext context) {
log.add(BaseUnit.getSymbolOf(context, currency));
return const SizedBox.shrink();
}
}
class _SubtreeCounter extends StatelessWidget {
const _SubtreeCounter(this.log, {required this.child});
final List<void> log;
final Widget child;
@override
Widget build(BuildContext context) {
log.add(null);
return child;
}
}
Widget _host(FakeMoneySettingsCubit cubit, Widget child) => MaterialApp(
home:
BlocProvider<MoneySettingsCubit>.value(value: cubit, child: BaseUnitScope(child: child)),
);
void main() {
group("BaseUnit", () {
group("BaseUnit.useBaseUnitOf", () {
testWidgets("reads the value from the nearest ancestor", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi),
);
final log = <List<bool>>[];
await tester.pumpWidget(
_host(cubit, _Probe.single(CryptoCurrency.btc, log: log)),
);
expect(log, [[true]]);
});
testWidgets("nearest ancestor wins when models are nested", (tester) async {
final log = <List<bool>>[];
await tester.pumpWidget(
BaseUnit(
state: _moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi),
child: BaseUnit(
state: _moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
child: _Probe.single(CryptoCurrency.btc, log: log),
),
),
);
expect(log.single, [false]);
});
testWidgets("throws when no BaseUnit ancestor exists", (tester) async {
await tester.pumpWidget(_Probe.single(CryptoCurrency.btc, log: <List<bool>>[]));
expect(tester.takeException(), isA<TypeError>());
});
});
group("BaseUnit.getSymbolOf", () {
testWidgets("returns the ticker under whole-coin mode", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final log = <String>[];
await tester.pumpWidget(_host(cubit, _SymbolProbe(CryptoCurrency.btc, log)));
expect(log.single, CryptoCurrency.btc.symbol);
});
testWidgets("flips to sats when the mode changes", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final log = <String>[];
await tester.pumpWidget(_host(cubit, _SymbolProbe(CryptoCurrency.btc, log)));
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi));
await _pumpEmission(tester);
expect(log, [CryptoCurrency.btc.symbol, "sats"]);
});
testWidgets("spares a symbol reader whose currency did not change", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi),
);
final btcLog = <String>[];
final btclnLog = <String>[];
await tester.pumpWidget(
_host(
cubit,
Row(
children: [
_SymbolProbe(CryptoCurrency.btc, btcLog, key: const ValueKey("btc")),
_SymbolProbe(CryptoCurrency.btcln, btclnLog, key: const ValueKey("btcln")),
],
),
),
);
expect(btcLog.single, "sats");
expect(btclnLog.single, "sats");
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshiForLightning));
await _pumpEmission(tester);
expect(btcLog.length, 2);
expect(btcLog.last, CryptoCurrency.btc.symbol);
expect(btclnLog.length, 1, reason: "btcln symbol did not change");
});
testWidgets("a non-bitcoin symbol is stable across every mode", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final log = <String>[];
await tester.pumpWidget(_host(cubit, _SymbolProbe(CryptoCurrency.xmr, log)));
for (final mode in BitcoinAmountDisplayMode.all) {
cubit.setState(_moneySettingsState(bitcoin: mode));
await _pumpEmission(tester);
}
expect(log.single, CryptoCurrency.xmr.symbol);
});
});
group("BaseUnit aspect notification", () {
testWidgets("rebuilds a dependent whose currency flipped", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final log = <List<bool>>[];
await tester.pumpWidget(_host(cubit, _Probe.single(CryptoCurrency.btc, log: log)));
expect(log.length, 1);
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi));
await _pumpEmission(tester);
expect(log.length, 2);
expect(log.last, [true]);
});
testWidgets("satoshi -> satoshiForLightning rebuilds btc but not btcln", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi),
);
final btcLog = <List<bool>>[];
final btclnLog = <List<bool>>[];
await tester.pumpWidget(
_host(
cubit,
Row(
children: [
_Probe.single(CryptoCurrency.btc, log: btcLog, key: const ValueKey("btc")),
_Probe.single(CryptoCurrency.btcln, log: btclnLog, key: const ValueKey("btcln")),
],
),
),
);
expect(btcLog.single, [true]);
expect(btclnLog.single, [true]);
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshiForLightning));
await _pumpEmission(tester);
// btc: true -> false, so it must rebuild.
expect(btcLog.length, 2);
expect(btcLog.last, [false]);
// btcln: true -> true. The aspect filter should have spared it.
expect(btclnLog.length, 1, reason: "btcln value did not change");
});
testWidgets("a currency outside the bitcoin family never rebuilds", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final log = <List<bool>>[];
await tester.pumpWidget(_host(cubit, _Probe.single(CryptoCurrency.xmr, log: log)));
for (final mode in BitcoinAmountDisplayMode.all) {
cubit.setState(_moneySettingsState(bitcoin: mode));
await _pumpEmission(tester);
}
expect(log.length, 1);
});
testWidgets("a dependent on several currencies rebuilds if any changed", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi),
);
final log = <List<bool>>[];
await tester.pumpWidget(
_host(
cubit,
_Probe(currencies: <Currency>[CryptoCurrency.xmr, CryptoCurrency.btc], log: log),
),
);
expect(log.single, [false, true]);
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshiForLightning));
await _pumpEmission(tester);
expect(log.length, 2);
expect(log.last, [false, false]);
});
testWidgets("a value-equal but distinct state does not reach dependents", (tester) async {
final initial = _moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi);
final cubit = FakeMoneySettingsCubit(initial);
final log = <List<bool>>[];
await tester.pumpWidget(_host(cubit, _Probe.single(CryptoCurrency.btc, log: log)));
expect(log.length, 1);
cubit.setState(initial.copyWith());
await _pumpEmission(tester);
expect(log.length, 1);
});
testWidgets("changing only displayMode does not reach useBaseUnit dependents",
(tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(
bitcoin: BitcoinAmountDisplayMode.satoshi,
display: BalanceDisplayMode.availableBalance,
),
);
final log = <List<bool>>[];
await tester.pumpWidget(
_host(cubit, _Probe.single(CryptoCurrency.btc, log: log)),
);
cubit.setState(
_moneySettingsState(
bitcoin: BitcoinAmountDisplayMode.satoshi,
display: BalanceDisplayMode.hiddenBalance,
),
);
await _pumpEmission(tester);
expect(log.length, 1);
});
});
group("BaseUnitScope subtree isolation", () {
testWidgets("an emission does not rebuild the subtree", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final subtreeLog = <void>[];
final probeLog = <List<bool>>[];
await tester.pumpWidget(
_host(
cubit,
_SubtreeCounter(
subtreeLog,
child: _Probe.single(CryptoCurrency.btc, log: probeLog),
),
),
);
expect(subtreeLog.length, 1);
expect(probeLog.length, 1);
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi));
await _pumpEmission(tester);
expect(probeLog.length, 2);
expect(probeLog.last, [true]);
expect(subtreeLog.length, 1, reason: "the subtree was rebuilt");
});
testWidgets("nested subtrees below the boundary are untouched", (tester) async {
final cubit = FakeMoneySettingsCubit(
_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.bitcoin),
);
final outerLog = <void>[];
final innerLog = <void>[];
final probeLog = <List<bool>>[];
await tester.pumpWidget(
_host(
cubit,
_SubtreeCounter(
outerLog,
child: Padding(
padding: EdgeInsets.zero,
child: _SubtreeCounter(
innerLog,
child: _Probe.single(CryptoCurrency.btc, log: probeLog),
),
),
),
),
);
cubit.setState(_moneySettingsState(bitcoin: BitcoinAmountDisplayMode.satoshi));
await _pumpEmission(tester);
expect(probeLog.length, 2);
expect(outerLog.length, 1);
expect(innerLog.length, 1);
});
});
});
}