What changed, and why it matters
This is a routine release-candidate commit for Cake Wallet version 6.4.5. Most of the changes are version bumps, translated changelogs, and a new user-facing string about Trezor locktime. The actual code changes are small bug fixes and usability improvements: making sure a mutex is always released, preventing concurrent updates to the Monero coin list, improving Trezor Bluetooth session handling, and temporarily disabling the Exolix exchange provider. Nothing in the diff clearly introduces a security vulnerability, and the vendor does not describe any of the changes as security fixes.
Treat as a normal release-candidate update. Review the updated trezor-flutter and universal_ble dependency commits for any security-relevant changes, since their diffs are not included here. No immediate security response is indicated by the supplied materials.
Security signals we found
Mutex release moved into finally block, reducing risk of deadlock on exception paths
Monero coin-control concurrency fix and improved coin metadata matching for hardware wallets
Trezor session management changes to prevent cross-wallet session misuse
Exolix exchange provider disabled (availability change, no stated security reason)
Dependency git refs updated for trezor-flutter and universal_ble
Evidence from the diff
The commit bumps app versions to 6.4.5 and refreshes localized changelogs and strings. Functional code changes include: (1) wrapping a transaction-history mutex release in try/finally; (2) serializing Monero updateUnspent() calls, building the unspent-coin list in a local variable before swapping it in, tolerating missing transactions during is-change lookup, and matching coin metadata by hash/address/value instead of key-image alone to fix hardware-wallet coin-control issues; (3) adding Trezor session lifecycle helpers (prepareReconnect, cancelReconnect, bindSessionToWallet, isSessionFor, dropSession) and a BLE disconnect check to avoid prompting on startup; (4) showing a locktime notice during Bitcoin/Trezor signing; (5) setting ExolixExchangeProvider.isAvailable to false; and (6) updating git refs for trezor-flutter and universal_ble. No explicit security advisory, CVE, or researcher attribution is present.
Changed components
cw_monero/lib/api/transaction_history.dartcw_monero/lib/monero_wallet.dartlib/exchange/provider/exolix_exchange_provider.dartlib/new-ui/pages/send_page.dartlib/new-ui/widgets/hardware_wallet/proceed_on_device_message.dartlib/new-ui/widgets/send_page/send_confirm_bottom_widget.dartlib/view_model/hardware_wallet/trezor_connect_view_model.dartlib/view_model/wallet_hardware_restore_view_model.dartpubspec.lock / pubspec_base.yaml / pubspec_overrides.yaml (trezor-flutter, universal_ble refs)Inspect captured patch +296 / −85
### assets/new-ui/changelog/text/changelog_ar.json
@@ -1 +1 @@
-[{"title":"تريزور أصلا لبيتكوين","description":"قم بإقران جهازك وتوقيع معاملات Bitcoin مباشرة في التطبيق"},{"title":"تحسينات Solana وNFTs","description":"أرسل Solana NFTs الخاصة بك، واحتفظ بالبطاقات المستوردة المحفوظة، واطلع في لمحة سريعة على تلك التي تحتوي عليها هذه المحفظة"},{"title":"تحسينات مزامنة مونيرو","description":"يستمر تقدم المزامنة في التحرك أثناء تسخين محفظتك، حتى تعرف دائمًا مكانها"},{"title":"إصلاحات الشوائب","description":"مزامنة جهات الاتصال، واختيار العقدة، وتسجيل الدخول إلى Cake Pay، والمزيد، تم سحقها جميعًا"}]
\ No newline at end of file
+[{"title":"تحسينات تريزور","description":"يمكنك الآن إدخال عبارة المرور الخاصة بك على جهاز Trezor نفسه"},{"title":"تحسينات الشراء/البيع","description":"شراء وبيع العملات المشفرة الخاصة بك بشكل أسهل وأكثر سلاسة"},{"title":"تحسينات مونيرو","description":"يستمر تقدم المزامنة في التحرك أثناء تسخين محفظتك، حتى تعرف دائمًا مكانها"},{"title":"إصلاحات الشوائب","description":"مزامنة جهات الاتصال، واختيار العقدة، وتسجيل الدخول إلى Cake Pay، والمزيد، تم سحقها جميعًا"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_bg.json
@@ -1 +1 @@
-[{"title":"Trezor първоначално за биткойн","description":"Сдвоете вашето устройство и подписвайте биткойн транзакции направо в приложението"},{"title":"Solana и подобрения на NFT","description":"Изпратете вашите Solana NFT, запазете импортираните и вижте с един поглед кои съхранява този портфейл"},{"title":"Подобрения в синхронизирането на Monero","description":"Прогресът на синхронизирането продължава да се движи, докато портфейлът ви загрява, така че винаги да знаете къде се намира"},{"title":"Поправки на грешки","description":"Синхронизиране на контакти, избор на възел, влизане в Cake Pay и други, всички смачкани"}]
\ No newline at end of file
+[{"title":"Подобрения на Trezor","description":"сега можете да въведете вашата парола на самото устройство Trezor"},{"title":"Подобрения за покупка/продаване","description":"Купувайте и продавайте вашата крипто по-лесно и по-гладко"},{"title":"Подобрения на Monero","description":"Прогресът на синхронизирането продължава да се движи, докато портфейлът ви загрява, така че винаги да знаете къде се намира"},{"title":"Поправки на грешки","description":"Синхронизиране на контакти, избор на възел, влизане в Cake Pay и други, всички смачкани"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_cs.json
@@ -1 +1 @@
-[{"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é"}]
\ No newline at end of file
+[{"title":"Vylepšení Trezor","description":"nyní můžete zadat svou přístupovou frázi na samotném zařízení Trezor"},{"title":"Vylepšení nákupu/prodeje","description":"Nakupujte a prodávejte své kryptoměny snadněji a plynuleji"},{"title":"Vylepšení 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é"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_de.json
@@ -1 +1 @@
-[{"title":"Trezor-Unterstützung für Bitcoin","description":"Verbinden Sie Ihr Gerät und signieren Sie Bitcoin-Transaktionen direkt in der App."},{"title":"Verbesserungen für Solana und NFTs","description":"Senden Sie Ihre Solana-NFTs, speichern Sie importierte NFTs dauerhaft und erkennen Sie auf einen Blick, welche NFTs sich in dieser Wallet befinden."},{"title":"Verbesserungen bei der Monero-Synchronisierung","description":"Der Synchronisierungsfortschritt wird weiterhin angezeigt, während Ihre Wallet initialisiert wird. So wissen Sie jederzeit, wie weit der Vorgang ist."},{"title":"Fehlerbehebungen","description":"Verbesserungen bei der Kontaktsynchronisierung, Knotenauswahl und Cake-Pay-Anmeldung sowie weitere Fehlerbehebungen."}]
+[{"title":"Trezor-Verbesserungen","description":"Jetzt können Sie Ihre Passphrase auf dem Trezor-Gerät selbst eingeben"},{"title":"Verbesserungen beim Kauf/Verkauf","description":"Kaufen und verkaufen Sie Ihre Krypto einfacher und reibungsloser"},{"title":"Monero-Verbesserungen","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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_en.json
@@ -1,14 +1,14 @@
[
{
- "title": "Trezor natively for Bitcoin",
- "description": "Pair your device and sign Bitcoin transactions right in the app"
+ "title": "Trezor Enhancements",
+ "description": "now you can enter your passphrase on the Trezor device itself"
},
{
- "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": "Buy/Sell improvements",
+ "description": "Buy and Sell your crypto easier and smoother"
},
{
- "title": "Monero sync improvements",
+ "title": "Monero improvements",
"description": "Sync progress keeps moving while your wallet warms up, so you always know where it stands"
},
{
### assets/new-ui/changelog/text/changelog_es.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Mejoras en Trezor","description":"ahora puede ingresar su contraseña en el dispositivo Trezor"},{"title":"Mejoras en Compra/Venta","description":"Compra y vende tus criptomonedas de forma más fácil y fluida"},{"title":"Mejoras en 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_fa.json
@@ -1 +1 @@
-[{"title":"Trezor به صورت بومی برای بیت کوین","description":"دستگاه خود را جفت کنید و معاملات بیت کوین را مستقیماً در برنامه امضا کنید"},{"title":"بهبود سولانا و NFTs","description":"NFT های Solana خود را ارسال کنید، موارد وارداتی را ذخیره کنید و در یک نگاه ببینید که این کیف پول کدام یک را در خود جای می دهد."},{"title":"بهبود همگام سازی مونرو","description":"پیشرفت همگامسازی تا زمانی که کیف پول شما گرم میشود به حرکت خود ادامه میدهد، بنابراین همیشه میدانید کجا قرار دارد"},{"title":"رفع اشکال","description":"همگامسازی مخاطب، انتخاب گره، ورود به سیستم Cake Pay و موارد دیگر، همه له شدهاند"}]
\ No newline at end of file
+[{"title":"بهبودهای ترزور","description":"اکنون می توانید عبارت عبور خود را در خود دستگاه Trezor وارد کنید"},{"title":"خرید/فروش بهبود","description":"ارز دیجیتال خود را راحت تر و روان تر بخرید و بفروشید"},{"title":"بهبودهای مونرو","description":"پیشرفت همگامسازی تا زمانی که کیف پول شما گرم میشود به حرکت خود ادامه میدهد، بنابراین همیشه میدانید کجا قرار دارد"},{"title":"رفع اشکال","description":"همگامسازی مخاطب، انتخاب گره، ورود به سیستم Cake Pay و موارد دیگر، همه له شدهاند"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_fr.json
@@ -1 +1 @@
-[{"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é"}]
\ No newline at end of file
+[{"title":"Améliorations de Trezor","description":"vous pouvez maintenant saisir votre phrase secrète sur l'appareil Trezor lui-même"},{"title":"Améliorations d'achat/vente","description":"Achetez et vendez votre crypto plus facilement et plus facilement"},{"title":"Améliorations de 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é"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_gn.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Trezor Ñembotuichave rehegua","description":"ko’áĝa ikatu emoinge ne ñe’ẽñemi Trezor tembipuru’ípe voi"},{"title":"Jogua/Ovende ñemyatyrõ","description":"Ejogua ha Evende nde cripto ndahasýi ha isãsove"},{"title":"Monero ñemyatyrõ","description":"Progreso sincronización rehegua omýi meme ne 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_ha.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Trezor Enhancements","description":"yanzu zaku iya shigar da kalmar wucewar ku akan na'urar Trezor kanta"},{"title":"Sayi/sayar da haɓakawa","description":"Sayi da siyar da crypto ɗin ku cikin sauƙi da santsi"},{"title":"Monero ingantawa","description":"Ci gaban daidaitawa yana ci gaba da motsawa yayin da walat ɗin ku ke dumama, don haka koyaushe kuna san inda yake tsaye"},{"title":"Gyaran kwaro","description":"Daidaita lamba, zaɓin kumburi, shigar da Biyan Biyan Cake da ƙari, duk an murƙushe"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_hi.json
@@ -1 +1 @@
-[{"title":"ट्रेज़ोर मूल रूप से बिटकॉइन के लिए है","description":"अपने डिवाइस को पेयर करें और ऐप में ही बिटकॉइन लेनदेन पर हस्ताक्षर करें"},{"title":"सोलाना और एनएफटी सुधार","description":"अपने सोलाना एनएफटी भेजें, आयातित एनएफटी को सहेज कर रखें और एक नज़र में देखें कि इस वॉलेट में कौन से एनएफटी हैं"},{"title":"मोनेरो सिंक में सुधार","description":"जब आपका बटुआ गर्म हो जाता है तो सिंक प्रगति चलती रहती है, इसलिए आप हमेशा जानते हैं कि यह कहां खड़ा है"},{"title":"कंप्यूटर प्रोग्राम या प्रणाली में बग को दूर करना","description":"संपर्क सिंकिंग, नोड चयन, केक पे साइन-इन और बहुत कुछ, सब खत्म हो गया"}]
\ No newline at end of file
+[{"title":"ट्रेज़ोर संवर्द्धन","description":"अब आप अपना पासफ़्रेज़ ट्रेज़ोर डिवाइस पर ही दर्ज कर सकते हैं"},{"title":"खरीदें/बेचें सुधार","description":"अपना क्रिप्टो खरीदना और बेचना आसान और आसान है"},{"title":"मोनेरो सुधार","description":"जब आपका बटुआ गर्म हो जाता है तो सिंक प्रगति चलती रहती है, इसलिए आप हमेशा जानते हैं कि यह कहां खड़ा है"},{"title":"कंप्यूटर प्रोग्राम या प्रणाली में बग को दूर करना","description":"संपर्क सिंकिंग, नोड चयन, केक पे साइन-इन और बहुत कुछ, सब खत्म हो गया"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_hr.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Trezor poboljšanja","description":"sada možete unijeti svoju šifru na samom Trezor uređaju"},{"title":"Poboljšanja kupnje/prodaje","description":"Kupujte i prodajte svoju kriptovalutu lakše i jednostavnije"},{"title":"Monero poboljšanja","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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_hy.json
@@ -1 +1 @@
-[{"title":"Trezor բնիկ համար Bitcoin","description":"Զուգավորեք ձեր սարքը և ստորագրեք Bitcoin գործարքները հենց հավելվածում"},{"title":"Սոլանայի և NFT-ների բարելավումներ","description":"Ուղարկեք ձեր Solana NFT-ները, պահեք ներմուծվածները և մի հայացքով տեսեք, թե որոնք են պահում այս դրամապանակը"},{"title":"Monero-ի համաժամացման բարելավումներ","description":"Համաժամացման առաջընթացը շարունակվում է, մինչ ձեր դրամապանակը տաքանում է, այնպես որ դուք միշտ իմանաք, թե որտեղ է այն կանգնած"},{"title":"Սխալների շտկում","description":"Կոնտակտների համաժամացում, հանգույցների ընտրություն, Cake Pay-ի մուտք և ավելին, բոլորը սեղմված են"}]
\ No newline at end of file
+[{"title":"Trezor բարելավումներ","description":"այժմ դուք կարող եք մուտքագրել ձեր անցաբառը հենց Trezor սարքի վրա"},{"title":"Գնել/վաճառել բարելավումներ","description":"Գնեք և վաճառեք ձեր կրիպտոն ավելի հեշտ և հարթ"},{"title":"Monero բարելավումներ","description":"Համաժամացման առաջընթացը շարունակվում է, մինչ ձեր դրամապանակը տաքանում է, այնպես որ դուք միշտ իմանաք, թե որտեղ է այն կանգնած"},{"title":"Սխալների շտկում","description":"Կոնտակտների համաժամացում, հանգույցների ընտրություն, Cake Pay-ի մուտք և ավելին, բոլորը սեղմված են"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_id.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Peningkatan Trezor","description":"sekarang Anda dapat memasukkan frasa sandi Anda di perangkat Trezor itu sendiri"},{"title":"Peningkatan Beli/Jual","description":"Beli dan Jual kripto Anda lebih mudah dan lancar"},{"title":"Peningkatan 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_it.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Miglioramenti di Trezor","description":"ora puoi inserire la tua passphrase sul dispositivo Trezor stesso"},{"title":"Acquista/vendi miglioramenti","description":"Acquista e vendi le tue criptovalute in modo più semplice e fluido"},{"title":"Miglioramenti 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_ja.json
@@ -1 +1 @@
-[{"title":"Trezor はビットコインにネイティブ対応","description":"デバイスをペアリングして、アプリ内で直接ビットコイン取引に署名します"},{"title":"Solana と NFT の改善","description":"Solana NFT を送信し、インポートされた NFT を保存し、このウォレットにどの NFT が保持されているかを一目で確認できます"},{"title":"Monero 同期の改善","description":"ウォレットがウォームアップしている間も同期の進行状況は継続するため、ウォレットの状態を常に把握できます"},{"title":"バグ修正","description":"連絡先の同期、ノードの選択、Cake Pay のサインインなど、すべてが潰されています"}]
\ No newline at end of file
+[{"title":"Trezor の強化","description":"Trezor デバイス自体にパスフレーズを入力できるようになりました"},{"title":"売買の改善","description":"暗号通貨の売買をより簡単かつスムーズに"},{"title":"モネロの改善","description":"ウォレットがウォームアップしている間も同期の進行状況は継続するため、ウォレットの状態を常に把握できます"},{"title":"バグ修正","description":"連絡先の同期、ノードの選択、Cake Pay のサインインなど、すべてが潰されています"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_ko.json
@@ -1 +1 @@
-[{"title":"기본적으로 Bitcoin용 Trezor","description":"기기를 페어링하고 앱에서 바로 비트코인 거래에 서명하세요."},{"title":"솔라나 및 NFT 개선","description":"솔라나 NFT를 보내고, 가져온 NFT를 저장하고, 이 지갑에 어떤 NFT가 들어 있는지 한눈에 확인하세요"},{"title":"모네로 동기화 개선","description":"지갑이 준비되는 동안 동기화 진행이 계속 진행되므로 항상 현재 상태를 알 수 있습니다."},{"title":"버그 수정","description":"연락처 동기화, 노드 선택, Cake Pay 로그인 등이 모두 중단되었습니다."}]
\ No newline at end of file
+[{"title":"Trezor 향상","description":"이제 Trezor 장치 자체에 암호를 입력할 수 있습니다"},{"title":"구매/판매 개선 사항","description":"암호화폐를 더 쉽고 원활하게 구매하고 판매하세요"},{"title":"모네로 개선","description":"지갑이 준비되는 동안 동기화 진행이 계속 진행되므로 항상 현재 상태를 알 수 있습니다."},{"title":"버그 수정","description":"연락처 동기화, 노드 선택, Cake Pay 로그인 등이 모두 중단되었습니다."}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_my.json
@@ -1 +1 @@
-[{"title":"Bitcoin အတွက် မူရင်း Trezor","description":"သင့်စက်ကို တွဲချိတ်ပြီး အက်ပ်တွင် Bitcoin ငွေပေးငွေယူများကို လက်မှတ်ထိုးပါ။"},{"title":"Solana နှင့် NFTs တိုးတက်မှုများ","description":"သင်၏ Solana NFTs များကို ပေးပို့ပါ၊ တင်သွင်းထားသည့်အရာများကို သိမ်းဆည်းထားပါ၊ ဤပိုက်ဆံအိတ်တွင် မည်သည့်အရာများ ကိုင်ဆောင်ထားသည်ကို တစ်ချက်ကြည့်လိုက်ပါ။"},{"title":"Monero စင့်ခ်လုပ်ခြင်း တိုးတက်မှု","description":"သင့်ပိုက်ဆံအိတ် ပူနွေးလာချိန်တွင် စင့်ခ်လုပ်ဆောင်မှုသည် ဆက်လက်ရွေ့လျားနေသဖြင့် ၎င်းသည် မည်သည့်နေရာတွင် ရှိနေသည်ကို သင်အမြဲသိပါသည်။"},{"title":"ချွတ်ယွင်းချက်ပြင်ဆင်မှုများ","description":"အဆက်အသွယ်စင့်ခ်လုပ်ခြင်း၊ node ရွေးချယ်ခြင်း၊ Cake Pay လက်မှတ်ထိုးဝင်ခြင်းနှင့် အခြားအရာများအားလုံးကို ဖြိုခွဲလိုက်ပါပြီ။"}]
\ No newline at end of file
+[{"title":"Trezor မြှင့်တင်မှုများ","description":"ယခု သင်သည် Trezor စက်တွင် သင်၏ စကားဝှက်ကို ထည့်သွင်းနိုင်ပါပြီ။"},{"title":"တိုးတက်မှုများကို ဝယ်/ရောင်း","description":"သင်၏ crypto ကိုပိုမိုလွယ်ကူချောမွေ့စွာဝယ်ရောင်း"},{"title":"Monero တိုးတက်မှုများ","description":"သင့်ပိုက်ဆံအိတ် ပူနွေးလာချိန်တွင် စင့်ခ်လုပ်ဆောင်မှုသည် ဆက်လက်ရွေ့လျားနေသဖြင့် ၎င်းသည် မည်သည့်နေရာတွင် ရှိနေသည်ကို သင်အမြဲသိပါသည်။"},{"title":"ချွတ်ယွင်းချက်ပြင်ဆင်မှုများ","description":"အဆက်အသွယ်စင့်ခ်လုပ်ခြင်း၊ node ရွေးချယ်ခြင်း၊ Cake Pay လက်မှတ်ထိုးဝင်ခြင်းနှင့် အခြားအရာများအားလုံးကို ဖြိုခွဲလိုက်ပါပြီ။"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_nl.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Trezor-verbeteringen","description":"nu kunt u uw wachtwoordzin invoeren op het Trezor-apparaat zelf"},{"title":"Koop/verkoop-verbeteringen","description":"Koop en verkoop uw crypto eenvoudiger en soepeler"},{"title":"Monero-verbeteringen","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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_pl.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Ulepszenia Trezora","description":"teraz możesz wprowadzić hasło na samym urządzeniu Trezor"},{"title":"Kupuj/sprzedawaj ulepszenia","description":"Kupuj i sprzedawaj swoje kryptowaluty łatwiej i płynniej"},{"title":"Ulepszenia 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_pt.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Melhorias na Trezor","description":"agora você pode inserir sua senha no próprio dispositivo Trezor"},{"title":"Melhorias de compra/venda","description":"Compre e venda sua criptografia de maneira mais fácil e suave"},{"title":"Melhorias 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_ru.json
@@ -1 +1 @@
-[{"title":"Trezor изначально для биткойнов","description":"Подключите свое устройство и подпишите транзакции Bitcoin прямо в приложении."},{"title":"Улучшения Соланы и NFT","description":"Отправляйте свои NFT Solana, сохраняйте импортированные и сразу смотрите, какие из них хранятся в этом кошельке."},{"title":"Улучшения синхронизации Monero","description":"Процесс синхронизации продолжается, пока ваш кошелек нагревается, поэтому вы всегда знаете, где он находится."},{"title":"Исправления ошибок","description":"Синхронизация контактов, выбор узла, вход в систему Cake Pay и многое другое — все раздавлено"}]
\ No newline at end of file
+[{"title":"Улучшения Трезора","description":"теперь вы можете ввести парольную фразу на самом устройстве Trezor"},{"title":"Купить/продать улучшения","description":"Покупайте и продавайте свою криптовалюту проще и удобнее"},{"title":"Улучшения Монеро","description":"Процесс синхронизации продолжается, пока ваш кошелек нагревается, поэтому вы всегда знаете, где он находится."},{"title":"Исправления ошибок","description":"Синхронизация контактов, выбор узла, вход в систему Cake Pay и многое другое — все раздавлено"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_th.json
@@ -1 +1 @@
-[{"title":"Trezor โดยกำเนิดสำหรับ Bitcoin","description":"จับคู่อุปกรณ์ของคุณและลงนามธุรกรรม Bitcoin ในแอป"},{"title":"การปรับปรุง Solana และ NFT","description":"ส่ง Solana NFT ของคุณ เก็บรายการที่นำเข้าบันทึกไว้ และดูได้อย่างรวดเร็วว่ากระเป๋าสตางค์นี้เก็บรายการใดบ้าง"},{"title":"การปรับปรุงการซิงค์ Monero","description":"ความคืบหน้าในการซิงค์จะดำเนินต่อไปในขณะที่กระเป๋าเงินของคุณอุ่นขึ้น ดังนั้นคุณจะรู้อยู่เสมอว่ามันอยู่ที่ไหน"},{"title":"แก้ไขข้อบกพร่อง","description":"การซิงค์ผู้ติดต่อ การเลือกโหนด การลงชื่อเข้าใช้ Cake Pay และอื่นๆ ทั้งหมดถูกแบน"}]
\ No newline at end of file
+[{"title":"การปรับปรุง Trezor","description":"ตอนนี้คุณสามารถป้อนข้อความรหัสผ่านของคุณบนอุปกรณ์ Trezor ได้แล้ว"},{"title":"การปรับปรุงการซื้อ / ขาย","description":"ซื้อและขาย crypto ของคุณง่ายขึ้นและราบรื่นยิ่งขึ้น"},{"title":"การปรับปรุงโมเนโร","description":"ความคืบหน้าในการซิงค์จะดำเนินต่อไปในขณะที่กระเป๋าเงินของคุณอุ่นขึ้น ดังนั้นคุณจะรู้อยู่เสมอว่ามันอยู่ที่ไหน"},{"title":"แก้ไขข้อบกพร่อง","description":"การซิงค์ผู้ติดต่อ การเลือกโหนด การลงชื่อเข้าใช้ Cake Pay และอื่นๆ ทั้งหมดถูกแบน"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_tl.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Mga Pagpapahusay ng Trezor","description":"maaari mo na ngayong ilagay ang iyong passphrase sa mismong Trezor device"},{"title":"Bumili/Magbenta ng mga pagpapahusay","description":"Bilhin at Ibenta ang iyong crypto nang mas madali at mas maayos"},{"title":"Mga pagpapabuti 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_tr.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Trezor Geliştirmeleri","description":"artık parolanızı Trezor cihazına girebilirsiniz"},{"title":"Alım/Satış iyileştirmeleri","description":"Kriptonuzu daha kolay ve sorunsuz bir şekilde alıp satabilirsiniz"},{"title":"Monero 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_uk.json
@@ -1 +1 @@
-[{"title":"Trezor спочатку для Bitcoin","description":"Підключіть свій пристрій і підписуйте транзакції Bitcoin прямо в додатку"},{"title":"Покращення Solana та NFT","description":"Надсилайте свої NFT Solana, зберігайте імпортовані та одразу дивіться, які з них зберігає цей гаманець"},{"title":"Покращення синхронізації Monero","description":"Процес синхронізації продовжується, поки ваш гаманець розігрівається, тож ви завжди знаєте, де він стоїть"},{"title":"Виправлення помилок","description":"Синхронізація контактів, вибір вузла, вхід у систему Cake Pay тощо – усе зіпсовано"}]
\ No newline at end of file
+[{"title":"Покращення Trezor","description":"тепер ви можете ввести свою парольну фразу на самому пристрої Trezor"},{"title":"Купуйте/Продавайте покращення","description":"Купуйте та продавайте свою криптовалюту простіше та плавніше"},{"title":"Покращення Monero","description":"Процес синхронізації продовжується, поки ваш гаманець розігрівається, тож ви завжди знаєте, де він стоїть"},{"title":"Виправлення помилок","description":"Синхронізація контактів, вибір вузла, вхід у систему Cake Pay тощо – усе зіпсовано"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_ur.json
@@ -1 +1 @@
-[{"title":"Trezor مقامی طور پر Bitcoin کے لیے","description":"اپنے آلے کو جوڑیں اور ایپ میں ہی بٹ کوائن کے لین دین پر دستخط کریں۔"},{"title":"سولانا اور NFTs میں بہتری","description":"اپنے سولانا NFTs بھیجیں، درآمد شدہ کو محفوظ رکھیں، اور ایک نظر میں دیکھیں کہ اس پرس میں کون سا ہے"},{"title":"Monero مطابقت پذیری میں بہتری","description":"آپ کے بٹوے کے گرم ہونے کے دوران مطابقت پذیری کی پیشرفت جاری رہتی ہے، لہذا آپ کو ہمیشہ معلوم ہوتا ہے کہ یہ کہاں کھڑا ہے۔"},{"title":"بگ کی اصلاحات","description":"رابطہ کی مطابقت پذیری، نوڈ کا انتخاب، کیک پے سائن ان اور بہت کچھ، سب کو کچل دیا گیا۔"}]
\ No newline at end of file
+[{"title":"Trezor اضافہ","description":"اب آپ Trezor ڈیوائس پر ہی اپنا پاس فریز درج کر سکتے ہیں۔"},{"title":"خرید/فروخت میں بہتری","description":"اپنے کریپٹو کو آسان اور ہموار خریدیں اور بیچیں۔"},{"title":"مونیرو میں بہتری","description":"آپ کے بٹوے کے گرم ہونے کے دوران مطابقت پذیری کی پیشرفت جاری رہتی ہے، لہذا آپ کو ہمیشہ معلوم ہوتا ہے کہ یہ کہاں کھڑا ہے۔"},{"title":"بگ کی اصلاحات","description":"رابطہ کی مطابقت پذیری، نوڈ کا انتخاب، کیک پے سائن ان اور بہت کچھ، سب کو کچل دیا گیا۔"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_vi.json
@@ -1 +1 @@
-[{"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"}]
\ No newline at end of file
+[{"title":"Cải tiến Trezor","description":"bây giờ bạn có thể nhập cụm mật khẩu của mình trên chính thiết bị Trezor"},{"title":"Cải tiến Mua/Bán","description":"Mua và bán tiền điện tử của bạn dễ dàng và mượt mà hơn"},{"title":"Cải tiến 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"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_yo.json
@@ -1 +1 @@
-[{"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ọ"}]
\ No newline at end of file
+[{"title":"Trezor Awọn ilọsiwaju","description":"bayi o le tẹ ọrọ igbaniwọle rẹ sii lori ẹrọ Trezor funrararẹ"},{"title":"Ra / Ta awọn ilọsiwaju","description":"Ra ati Ta crypto rẹ rọrun ati irọrun"},{"title":"Monero awọn ilọsiwaju","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, Wiwọle Pay Cake Pay ati diẹ sii, gbogbo wọn ti fọ"}]
\ No newline at end of file
### assets/new-ui/changelog/text/changelog_zh-cn.json
@@ -1 +1 @@
-[{"title":"Trezor 原生适用于比特币","description":"配对您的设备并直接在应用程序中签署比特币交易"},{"title":"Solana 和 NFT 的改进","description":"发送您的 Solana NFT,保存导入的 NFT,并一目了然地查看该钱包包含哪些 NFT"},{"title":"门罗币同步改进","description":"当您的钱包热身时,同步进度会不断变化,因此您始终知道进展情况"},{"title":"错误修复","description":"联系人同步、节点选择、Cake Pay 登录等全部被压缩"}]
\ No newline at end of file
+[{"title":"Trezor 增强功能","description":"现在您可以在 Trezor 设备上输入您的密码"},{"title":"购买/销售改进","description":"购买和出售您的加密货币更轻松、更顺畅"},{"title":"门罗币改进","description":"当您的钱包热身时,同步进度会不断变化,因此您始终知道进展情况"},{"title":"错误修复","description":"联系人同步、节点选择、Cake Pay 登录等全部被压缩"}]
\ No newline at end of file
### cw_monero/lib/api/transaction_history.dart
@@ -132,12 +132,15 @@ Future<Transaction> getTransaction(String txId) async {
return txCache[currentWallet!.ffiAddress()]![txId]!;
}
await txHistoryMutex.acquire();
- final tx = txhistory!.transactionById(txId);
- final txDart = Transaction(txInfo: tx);
- txCache[currentWallet!.ffiAddress()] ??= {};
- txCache[currentWallet!.ffiAddress()]![txId] = txDart;
- txHistoryMutex.release();
- return txDart;
+ try {
+ final tx = txhistory!.transactionById(txId);
+ final txDart = Transaction(txInfo: tx);
+ txCache[currentWallet!.ffiAddress()] ??= {};
+ txCache[currentWallet!.ffiAddress()]![txId] = txDart;
+ return txDart;
+ } finally {
+ txHistoryMutex.release();
+ }
}
Future<PendingTransactionDescription> createTransactionSync(
### cw_monero/lib/monero_wallet.dart
@@ -648,11 +648,19 @@ abstract class MoneroWalletBase
await walletInfo.save();
}
- Future<void> updateUnspent() async {
+ Future<void>? _updateUnspentInFlight;
+
+ /// Concurrent callers share one run: two runs at once work on the same [unspentCoins] list, and
+ /// the clean up of the one then deletes the coin infos of the other.
+ Future<void> updateUnspent() => _updateUnspentInFlight ??=
+ _updateUnspent().whenComplete(() => _updateUnspentInFlight = null);
+
+ Future<void> _updateUnspent() async {
try {
refreshCoins(walletAddresses.account!.id);
- unspentCoins.clear();
+ // Collected separately, so nobody ever sees a half filled list
+ final unspentCoins = <MoneroUnspent>[];
final coinCount = await countOfCoins();
for (var i = 0; i < coinCount; i++) {
@@ -670,35 +678,60 @@ abstract class MoneroWalletBase
);
// TODO: double-check the logic here
if (unspent.hash.isNotEmpty) {
- final tx = await transaction_history.getTransaction(unspent.hash);
- unspent.isChange = tx.isSpend == true;
+ try {
+ final tx = await transaction_history.getTransaction(unspent.hash);
+ unspent.isChange = tx.isSpend == true;
+ } catch (e) {
+ // The transaction may not be in the (not yet refreshed) history, that must not
+ // keep the output, and all the ones after it, out of coin control.
+ printV("isChange lookup failed for ${unspent.hash}: $e");
+ }
}
unspentCoins.add(unspent);
}
}
+ this.unspentCoins
+ ..clear()
+ ..addAll(unspentCoins);
if (unspentCoinsInfo.isEmpty) {
unspentCoins.forEach((coin) => _addCoinInfo(coin));
return;
}
if (unspentCoins.isNotEmpty) {
- unspentCoins.forEach((coin) {
- final coinInfoList = unspentCoinsInfo.values.where((element) =>
- element.walletId.contains(id) &&
- element.accountIndex == walletAddresses.account!.id &&
- element.keyImage!.contains(coin.keyImage!));
+ final usedInfoKeys = <dynamic>{};
+ for (final coin in unspentCoins) {
+ final coinInfoList = unspentCoinsInfo.values
+ .where((element) =>
+ element.walletId.contains(id) &&
+ element.accountIndex == walletAddresses.account!.id &&
+ !usedInfoKeys.contains(element.key) &&
+ _isSameCoin(element, coin))
+ .toList();
if (coinInfoList.isNotEmpty) {
- final coinInfo = coinInfoList.first;
+ // The key image only breaks a tie between identical outputs of one transaction
+ final coinInfo = coinInfoList.firstWhere(
+ (element) => element.keyImage == coin.keyImage,
+ orElse: () => coinInfoList.first,
+ );
+ usedInfoKeys.add(coinInfo.key);
coin.isFrozen = coinInfo.isFrozen;
coin.isSending = coinInfo.isSending;
coin.note = coinInfo.note;
+
+ // The key image of a hardware wallet's output is only known after syncing with the
+ // device; keep the existing info (frozen state, note) instead of orphaning it.
+ if (coinInfo.keyImage != coin.keyImage) {
+ coinInfo.keyImage = coin.keyImage;
+ await coinInfo.save();
+ }
} else {
- _addCoinInfo(coin);
+ await _addCoinInfo(coin);
}
- });
+ }
}
await _refreshUnspentCoinsInfo();
@@ -713,6 +746,12 @@ abstract class MoneroWalletBase
}
}
+ /// The key image can't identify an output: a hardware wallet doesn't know the key images of its
+ /// outputs until they are synced with the device, until then they all carry the same
+ /// placeholder, which made every output match the info of the first one.
+ bool _isSameCoin(UnspentCoinsInfo info, MoneroUnspent coin) =>
+ info.hash == coin.hash && info.address == coin.address && info.value == coin.value;
+
Future<void> _addCoinInfo(MoneroUnspent coin) async {
final newInfo = UnspentCoinsInfo(
walletId: id,
@@ -738,8 +777,7 @@ abstract class MoneroWalletBase
if (currentWalletUnspentCoins.isNotEmpty) {
currentWalletUnspentCoins.forEach((element) {
- final existUnspentCoins =
- unspentCoins.where((coin) => element.keyImage!.contains(coin.keyImage!));
+ final existUnspentCoins = unspentCoins.where((coin) => _isSameCoin(element, coin));
if (existUnspentCoins.isEmpty) {
keys.add(element.key);
### lib/exchange/provider/exolix_exchange_provider.dart
@@ -27,7 +27,7 @@ class ExolixExchangeProvider extends ExchangeProvider {
String get title => 'Exolix';
@override
- bool get isAvailable => true;
+ bool get isAvailable => false;
@override
bool get isEnabled => true;
### lib/new-ui/pages/send_page.dart
@@ -48,6 +48,7 @@ import "package:cake_wallet/src/widgets/standard_checkbox.dart";
import "package:cake_wallet/utils/payment_request.dart";
import "package:cake_wallet/utils/show_pop_up.dart";
import "package:cake_wallet/view_model/contact_list/contact_list_view_model.dart";
+import "package:cake_wallet/view_model/hardware_wallet/trezor_connect_view_model.dart";
import "package:cake_wallet/view_model/link_view_model.dart";
import "package:cake_wallet/view_model/send/output.dart";
import "package:cake_wallet/view_model/send/send_view_model.dart";
@@ -861,8 +862,23 @@ class _NewSendPageState extends State<NewSendPage> {
}
if (widget.sendViewModel.wallet.isHardwareWallet) {
+ final trezorVM = widget.sendViewModel.hardwareWalletViewModel;
+ if (trezorVM is TrezorConnectViewModel &&
+ widget.sendViewModel.walletType == WalletType.bitcoin &&
+ trezorVM.isConnected(WalletType.bitcoin) &&
+ !trezorVM.isSessionFor(widget.sendViewModel.wallet)) {
+ // The live session belongs to another wallet (passphrase); open one for this wallet
+ await trezorVM.dropSession();
+ }
+
if (!widget.sendViewModel.hardwareWalletViewModel!
.isConnected(widget.sendViewModel.walletType)) {
+ final hardwareWalletVM = widget.sendViewModel.hardwareWalletViewModel;
+ if (hardwareWalletVM is TrezorConnectViewModel &&
+ widget.sendViewModel.walletType == WalletType.bitcoin) {
+ hardwareWalletVM.prepareReconnect(widget.sendViewModel.wallet);
+ }
+
await Navigator.of(context).pushNamed(
Routes.connectDevices,
arguments: ConnectDevicePageParams(
@@ -875,6 +891,9 @@ class _NewSendPageState extends State<NewSendPage> {
isReconnect: false,
),
);
+ if (hardwareWalletVM is TrezorConnectViewModel) {
+ hardwareWalletVM.cancelReconnect();
+ }
// Recheck to handle tap-backs
if (!widget.sendViewModel.hardwareWalletViewModel!
### lib/new-ui/widgets/hardware_wallet/proceed_on_device_message.dart
@@ -4,10 +4,17 @@ import 'package:cw_core/wallet_info.dart';
import 'package:flutter/material.dart';
class HardwareWalletProceedOnDeviceMessage extends StatelessWidget {
- const HardwareWalletProceedOnDeviceMessage({super.key, required this.hardwareWalletType});
+ const HardwareWalletProceedOnDeviceMessage({
+ super.key,
+ required this.hardwareWalletType,
+ this.note,
+ });
final HardwareWalletType hardwareWalletType;
+ /// Optional hint about what the device is going to ask
+ final String? note;
+
@override
Widget build(BuildContext context) {
return Container(
@@ -35,7 +42,17 @@ class HardwareWalletProceedOnDeviceMessage extends StatelessWidget {
fontWeight: FontWeight.w400,
color: Theme.of(context).colorScheme.onSurface,
),
- )
+ ),
+ if (note != null)
+ Text(
+ note!,
+ textAlign: TextAlign.center,
+ style: TextStyle(
+ fontSize: 13,
+ fontWeight: FontWeight.w400,
+ color: Theme.of(context).colorScheme.onSurfaceVariant,
+ ),
+ ),
]),
),
);
### lib/new-ui/widgets/send_page/send_confirm_bottom_widget.dart
@@ -6,6 +6,8 @@ import 'package:cake_wallet/new-ui/widgets/new_primary_button.dart';
import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
import 'package:cake_wallet/view_model/send/send_view_model.dart';
import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
+import 'package:cw_core/wallet_info.dart';
+import 'package:cw_core/wallet_type.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
@@ -61,7 +63,12 @@ class SendConfirmBottomWidget extends StatelessWidget {
);
case IsAwaitingDeviceResponseState:
return HardwareWalletProceedOnDeviceMessage(
- hardwareWalletType: sendViewModel.wallet.hardwareWalletType!);
+ hardwareWalletType: sendViewModel.wallet.hardwareWalletType!,
+ note: sendViewModel.walletType == WalletType.bitcoin &&
+ sendViewModel.wallet.hardwareWalletType == HardwareWalletType.trezor
+ ? S.of(context).trezor_locktime_notice
+ : null,
+ );
case TransactionCommitting:
return LoadingBottomWidget(
text: "${S.of(context).sending}...",
### lib/view_model/hardware_wallet/trezor_connect_view_model.dart
@@ -149,6 +149,49 @@ abstract class TrezorConnectViewModelBase extends HardwareWalletViewModel with S
Completer<String?>? _pinCompleter;
Completer<TrezorDeviceSettings>? _settingsCompleter;
+ /// Settings that successfully opened a session, kept in memory (never persisted) per wallet id
+ /// so a reconnect during a send doesn't ask for the wallet options / passphrase again.
+ final Map<String, TrezorDeviceSettings> _sessionSettings = {};
+ TrezorDeviceSettings? _lastUsedSettings;
+ String? _reconnectWalletId;
+
+ /// The wallet the live session (and with it the passphrase) belongs to, null if unknown
+ String? _sessionWalletId;
+
+ /// Call right before opening the connect page to reconnect the device for [wallet].
+ /// Only then the settings of the previous session are reused; creating or restoring a wallet
+ /// always asks for them.
+ void prepareReconnect(WalletBase wallet) => _reconnectWalletId = wallet.id;
+
+ /// Call when the connect page opened after [prepareReconnect] is closed, so an attempt that was
+ /// backed out of can never leak its settings into a later, unrelated connect (e.g. a restore).
+ void cancelReconnect() => _reconnectWalletId = null;
+
+ /// Call once a wallet was created / restored with the live session
+ void bindSessionToWallet(WalletBase wallet) {
+ _sessionWalletId = wallet.id;
+ final settings = _lastUsedSettings;
+ if (settings != null) {
+ _sessionSettings[wallet.id] = settings;
+ _lastUsedSettings = null;
+ }
+ }
+
+ /// False if the live session is known to belong to another wallet, e.g. one with a different
+ /// passphrase. Using it would only fail when signing.
+ bool isSessionFor(WalletBase wallet) =>
+ _sessionWalletId == null || _sessionWalletId == wallet.id;
+
+ Future<void> dropSession() async {
+ final client = _client;
+ _client = null;
+ _sessionWalletId = null;
+ _lastUsedSettings = null;
+ try {
+ await client?.connection.disconnect();
+ } catch (_) {}
+ }
+
@observable
TrezorParingState paringState = TrezorParingState.initial;
@@ -172,6 +215,10 @@ abstract class TrezorConnectViewModelBase extends HardwareWalletViewModel with S
isConnecting = true;
paringState = TrezorParingState.initial;
+ final reconnectWalletId = _reconnectWalletId;
+ _reconnectWalletId = null;
+ final reusedSettings = reconnectWalletId != null ? _sessionSettings[reconnectWalletId] : null;
+
try {
final trezorInterface =
device.connectionType == HardwareWalletConnectionType.ble ? trezorBLE : trezorUSB;
@@ -226,10 +273,15 @@ abstract class TrezorConnectViewModelBase extends HardwareWalletViewModel with S
_state!.pairingCredentials.any((c) => c.autoconnect == true);
final isAutoPairingAvailable = _client is sdk.TrezorClientV2 && !hasAutoPairingCredentials;
- paringState =
- TrezorParingState.awaitingSettings(isAutoPairingAvailable: isAutoPairingAvailable);
- _settingsCompleter = Completer<TrezorDeviceSettings>();
- final settings = await _settingsCompleter!.future;
+ final TrezorDeviceSettings settings;
+ if (reusedSettings != null) {
+ settings = reusedSettings;
+ } else {
+ paringState =
+ TrezorParingState.awaitingSettings(isAutoPairingAvailable: isAutoPairingAvailable);
+ _settingsCompleter = Completer<TrezorDeviceSettings>();
+ settings = await _settingsCompleter!.future;
+ }
paringState = TrezorParingState.awaitingPassphrase;
if (settings.enableAutoParing && isAutoPairingAvailable) {
@@ -249,18 +301,28 @@ abstract class TrezorConnectViewModelBase extends HardwareWalletViewModel with S
await _client!.createSession(passphrase);
}
+ _lastUsedSettings = settings;
+ _sessionWalletId = reconnectWalletId;
paringState = TrezorParingState.success;
return true;
} catch (e) {
await _client?.connection.disconnect();
_client = null;
- _state = sdk.ThpState();
+ _sessionWalletId = null;
+ _lastUsedSettings = null;
+ // Drop the (possibly half way through a handshake) state, the next attempt reloads the
+ // saved pairing credentials instead of asking for the pairing code again.
+ _state = null;
+ if (reconnectWalletId != null) {
+ _sessionSettings.remove(reconnectWalletId);
+ }
// rethrow;
paringState = TrezorParingState.fail(e.toString());
printV(e);
return false;
} finally {
isConnecting = false;
+ _reconnectWalletId = null;
}
}
@@ -299,6 +361,13 @@ abstract class TrezorConnectViewModelBase extends HardwareWalletViewModel with S
@override
Future<void> initWallet(WalletBase wallet) async {
+ // Only a session that was opened for this wallet may hand its settings to it
+ final lastUsedSettings = _lastUsedSettings;
+ if (lastUsedSettings != null && _sessionWalletId == wallet.id) {
+ _sessionSettings[wallet.id] = lastUsedSettings;
+ _lastUsedSettings = null;
+ }
+
switch (wallet.type) {
case WalletType.monero:
return monero!.setHardwareWalletService(wallet, getHardwareWalletService(wallet.type));
@@ -354,10 +423,30 @@ abstract class TrezorConnectViewModelBase extends HardwareWalletViewModel with S
}
}
- void _connectionChangeListener(sdk.BleConnectionState event) {
- printV("Ledger Device State Changed: $event");
- if (event == sdk.BleConnectionState.disconnected && !isConnecting) {
+ Future<void> _connectionChangeListener(sdk.BleConnectionState event) async {
+ printV("Trezor Device State Changed: $event");
+ if (event != sdk.BleConnectionState.disconnected || isConnecting) {
+ return;
+ }
+
+ final client = _client;
+ if (client == null) {
+ return;
+ }
+
+ // The events aren't device specific, so check if it's actually our Trezor that is gone
+ if (client.connection.connectionType == sdk.ConnectionType.ble) {
+ try {
+ final state = await sdk.UniversalBle.getConnectionState(client.connection.device.id);
+ if (state == sdk.BleConnectionState.connected) {
+ return;
+ }
+ } catch (_) {}
+ }
+
+ if (identical(_client, client)) {
_client = null;
+ _sessionWalletId = null;
}
}
### lib/view_model/wallet_hardware_restore_view_model.dart
@@ -6,6 +6,7 @@ import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/view_model/hardware_wallet/hardware_wallet_view_model.dart';
+import 'package:cake_wallet/view_model/hardware_wallet/trezor_connect_view_model.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
import 'package:cw_core/hardware/hardware_account_data.dart';
@@ -103,6 +104,12 @@ abstract class WalletHardwareRestoreViewModelBase extends WalletCreationVM with
@override
Future<WalletBase> process(WalletCredentials credentials) async {
walletCreationService.changeWalletType(type: type);
- return walletCreationService.restoreFromHardwareWallet(credentials);
+ final wallet = await walletCreationService.restoreFromHardwareWallet(credentials);
+
+ final hardwareWalletVM = this.hardwareWalletVM;
+ if (hardwareWalletVM is TrezorConnectViewModel && type == WalletType.bitcoin) {
+ hardwareWalletVM.bindSessionToWallet(wallet);
+ }
+ return wallet;
}
}
### pubspec.lock
@@ -3098,18 +3098,18 @@ packages:
dependency: "direct main"
description:
path: trezor-flutter
- ref: 02771769fc800c06e29ac9186e37e9c2aeb0b54c
- resolved-ref: 02771769fc800c06e29ac9186e37e9c2aeb0b54c
- url: "https://github.com/cake-tech/trezor-flutter"
+ ref: "591d4b8c821b9c10561f848b866324a9a8dcb489"
+ resolved-ref: "591d4b8c821b9c10561f848b866324a9a8dcb489"
+ url: "https://github.com/cake-tech/trezor-flutter.git"
source: git
version: "0.1.0"
trezor_usb_transport:
dependency: "direct overridden"
description:
path: trezor_usb_transport
- ref: 02771769fc800c06e29ac9186e37e9c2aeb0b54c
- resolved-ref: 02771769fc800c06e29ac9186e37e9c2aeb0b54c
- url: "https://github.com/cake-tech/trezor-flutter"
+ ref: "591d4b8c821b9c10561f848b866324a9a8dcb489"
+ resolved-ref: "591d4b8c821b9c10561f848b866324a9a8dcb489"
+ url: "https://github.com/cake-tech/trezor-flutter.git"
source: git
version: "0.0.1"
tuple:
@@ -3161,8 +3161,8 @@ packages:
dependency: "direct overridden"
description:
path: "."
- ref: "6735c1bdf7f42c501d51c20564eb957c3a12b981"
- resolved-ref: "6735c1bdf7f42c501d51c20564eb957c3a12b981"
+ ref: "9952fc72ded48891844d7786c0fa14c4cae1ce0b"
+ resolved-ref: "9952fc72ded48891844d7786c0fa14c4cae1ce0b"
url: "https://github.com/cake-tech/universal_ble.git"
source: git
version: "2.0.0"
### pubspec_base.yaml
@@ -234,7 +234,7 @@ dev_dependencies:
# universal_ble:
# git:
# url: https://github.com/cake-tech/universal_ble.git
-# ref: 6735c1bdf7f42c501d51c20564eb957c3a12b981
+# ref: 9952fc72ded48891844d7786c0fa14c4cae1ce0b
# flutter_secure_storage:
# git:
# url: https://github.com/cake-tech/flutter_secure_storage.git
### pubspec_overrides.yaml
@@ -1515,7 +1515,7 @@ dependency_overrides:
universal_ble:
git:
url: https://github.com/cake-tech/universal_ble.git
- ref: 6735c1bdf7f42c501d51c20564eb957c3a12b981
+ ref: 9952fc72ded48891844d7786c0fa14c4cae1ce0b
universal_io:
git:
url: https://github.com/dart-io-packages/universal_io
### res/values/strings_ar.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "ستظهر معاملاتك هنا.",
"transparent_secret_key": "المفتاح السري الشفاف",
"transport_type": "نوع النقل",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "هو مُجمِّع تبادل يستفيد من عدة منصات تداول أساسية للعثور على أسعار تنافسية.",
"trocador_desc_kyc": "إلى جانب اسم المزوّد، يظهر تصنيف KYC. يتم تحديده بواسطة Trocador وهو يعتمد على معاييرهم الخاصة.",
"trongrid_history": "سجل TronGrid",
### res/values/strings_bg.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Вашите транзакции ще се появят тук.",
"transparent_secret_key": "Прозрачен таен ключ",
"transport_type": "Тип транспорт",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "е агрегатор за обмен, който използва множество борси, за да намери конкурентни курсове.",
"trocador_desc_kyc": "До името на доставчика се показва KYC рейтинг. Той се задава от Trocador и се основава на техни собствени критерии.",
"trongrid_history": "История на TronGrid",
### res/values/strings_cs.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Zde se zobrazí vaše transakce.",
"transparent_secret_key": "Transparentní tajný klíč",
"transport_type": "Typ transportu",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "je agregátor směnáren, který využívá více podkladových směnáren k nalezení konkurenceschopných kurzů.",
"trocador_desc_kyc": "Vedle názvu poskytovatele se zobrazuje hodnocení KYC. Toto hodnocení nastavuje Trocador a je založeno na jejich vlastních kritériích.",
"trongrid_history": "Historie TronGrid",
### res/values/strings_de.arb
@@ -1378,6 +1378,7 @@
"transactions_will_appear_here": "Ihre Transaktionen werden hier angezeigt.",
"transparent_secret_key": "Transparenter geheimer Schlüssel",
"transport_type": "Transporttyp",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "ist ein Swap-Aggregator, der mehrere zugrunde liegende Swap-Dienste nutzt, um wettbewerbsfähige Kurse zu finden.",
"trocador_desc_kyc": "Neben dem Anbieternamen wird ein KYC-Rating angezeigt. Dieses wird von Trocador festgelegt und basiert auf deren eigenen Kriterien.",
"trongrid_history": "TronGrid-Verlauf",
### res/values/strings_en.arb
@@ -1378,6 +1378,7 @@
"transactions_will_appear_here": "Your transactions will appear here.",
"transparent_secret_key": "Transparent Secret Key",
"transport_type": "Transport Type",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "is an exchange aggregator that leverages multiple underlying exchanges to find competitive rates.",
"trocador_desc_kyc": "Alongside the provider name, a KYC Rating is shown. This is set by Trocador and it's based on their own criteria.",
"trongrid_history": "TronGrid history",
### res/values/strings_es.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "Tus transacciones aparecerán aquí.",
"transparent_secret_key": "Clave secreta transparente",
"transport_type": "Tipo de transporte",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "es un agregador de exchanges que aprovecha múltiples exchanges subyacentes para encontrar tasas competitivas.",
"trocador_desc_kyc": "Junto al nombre del proveedor, se muestra una calificación de KYC. Esto lo establece Trocador y se basa en sus propios criterios.",
"trongrid_history": "Historial de TronGrid",
### res/values/strings_fa.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "تراکنشهای شما اینجا نمایش داده میشوند.",
"transparent_secret_key": "کلید محرمانه شفاف",
"transport_type": "نوع انتقال",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "یک تجمیعکنندهٔ صرافی است که با استفاده از چندین صرافیِ زیربنایی، نرخهای رقابتی را پیدا میکند.",
"trocador_desc_kyc": "در کنار نام ارائهدهنده، یک رتبهبندی KYC نمایش داده میشود. این رتبهبندی توسط Trocador تعیین میشود و بر اساس معیارهای خودشان است.",
"trongrid_history": "تاریخچه TronGrid",
### res/values/strings_fr.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Vos transactions apparaîtront ici.",
"transparent_secret_key": "Clé secrète transparente",
"transport_type": "Type de transport",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "est un agrégateur d'échanges qui s'appuie sur plusieurs plateformes d'échange sous-jacentes afin de trouver des taux compétitifs.",
"trocador_desc_kyc": "À côté du nom du fournisseur, une note KYC est affichée. Celle-ci est définie par Trocador et repose sur ses propres critères.",
"trongrid_history": "Historique TronGrid",
### res/values/strings_gn.arb
@@ -1382,6 +1382,7 @@
"transactions_will_appear_here": "Ko’ápe ojehechaukáta ne transacción-kuéra.",
"transparent_secret_key": "Clave Secreta Transparente",
"transport_type": "Transporte Mba'eichagua",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "ha'e peteĩ agregador de intercambio oiporúva heta intercambio subyacente ojuhú hag̃ua tasa competitiva.",
"trocador_desc_kyc": "Pe proveedor réra ykére, ojehechauka peteĩ calificación KYC rehegua. Péva omoĩ Trocador ha oñemopyenda ijehegui hag̃uaichaite hag̃ua.",
"trongrid_history": "TronGrid rembiasakue",
### res/values/strings_ha.arb
@@ -1378,6 +1378,7 @@
"transactions_will_appear_here": "Ma’amalolinku za su bayyana a nan.",
"transparent_secret_key": "Maɓallin Sirri na Transparent",
"transport_type": "Nau'in haɗi (transport)",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "mai tara musayar kuɗaɗen dijital ne wanda ke amfani da musayar kuɗaɗe da yawa a ƙarƙashinsa don nemo farashi masu gasa.",
"trocador_desc_kyc": "Tare da sunan mai ba da sabis, ana nuna ƙimar KYC. Trocador ne ya saita wannan, kuma yana dogara ne da nasu ƙa’idoji.",
"trongrid_history": "Tarihin TronGrid",
### res/values/strings_hi.arb
@@ -1378,6 +1378,7 @@
"transactions_will_appear_here": "आपके लेन-देन यहां दिखाई देंगे।",
"transparent_secret_key": "पारदर्शी गुप्त कुंजी",
"transport_type": "परिवहन प्रकार",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "एक एक्सचेंज एग्रीगेटर है, जो प्रतिस्पर्धी दरें खोजने के लिए कई अंतर्निहित एक्सचेंजों का उपयोग करता है।",
"trocador_desc_kyc": "प्रदाता के नाम के साथ, एक KYC रेटिंग दिखाई जाती है। यह Trocador द्वारा निर्धारित की जाती है और यह उनके अपने मानदंडों पर आधारित है।",
"trongrid_history": "TronGrid इतिहास",
### res/values/strings_hr.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Vaše transakcije će se pojaviti ovdje.",
"transparent_secret_key": "Transparentni tajni ključ",
"transport_type": "Vrsta transporta",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "je agregator mjenjačnica koji koristi više mjenjačnica kako bi pronašao konkurentne tečajeve.",
"trocador_desc_kyc": "Uz naziv pružatelja usluga prikazuje se KYC ocjena. To je postavio Trocador i temelji se na njihovim vlastitim kriterijima.",
"trongrid_history": "Povijest TronGrid-a",
### res/values/strings_hy.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Ձեր գործարքները կհայտնվեն այստեղ։",
"transparent_secret_key": "Թափանցիկ գաղտնի բանալի",
"transport_type": "Տրանսպորտի տեսակ",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "փոխանակման ագրեգատոր է, որը օգտագործում է մի քանի հիմքում ընկած փոխանակումներ՝ մրցունակ փոխարժեքներ գտնելու համար։",
"trocador_desc_kyc": "Մատակարարի անվան հետ մեկտեղ ցուցադրվում է KYC վարկանիշը։ Այն սահմանվում է Trocador-ի կողմից և հիմնված է նրանց սեփական չափանիշների վրա։",
"trongrid_history": "TronGrid-ի պատմություն",
### res/values/strings_id.arb
@@ -1379,6 +1379,7 @@
"transactions_will_appear_here": "Transaksi Anda akan muncul di sini.",
"transparent_secret_key": "Kunci Rahasia Transparan",
"transport_type": "Jenis Transport",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "adalah agregator pertukaran yang memanfaatkan berbagai pertukaran yang mendasarinya untuk menemukan kurs yang kompetitif.",
"trocador_desc_kyc": "Di samping nama penyedia, Peringkat KYC ditampilkan. Ini ditetapkan oleh Trocador dan didasarkan pada kriteria mereka sendiri.",
"trongrid_history": "Riwayat TronGrid",
### res/values/strings_it.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "Le tue transazioni appariranno qui.",
"transparent_secret_key": "Chiave segreta trasparente",
"transport_type": "Tipo di trasporto",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "è un aggregatore di exchange che sfrutta più exchange sottostanti per trovare tassi competitivi.",
"trocador_desc_kyc": "Accanto al nome del fornitore viene mostrata una valutazione KYC. Questa è impostata da Trocador e si basa sui propri criteri.",
"trongrid_history": "Cronologia di TronGrid",
### res/values/strings_ja.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "あなたの取引履歴がここに表示されます。",
"transparent_secret_key": "トランスペアレント秘密鍵",
"transport_type": "トランスポートタイプ",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "は、複数の取引所を活用して競争力のあるレートを見つける交換アグリゲーターです。",
"trocador_desc_kyc": "プロバイダー名とともに、KYC評価が表示されます。これはTrocadorによって設定され、独自の基準に基づいています。",
"trongrid_history": "TronGrid 履歴",
### res/values/strings_ko.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "거래 내역이 여기에 표시됩니다.",
"transparent_secret_key": "투명 비밀 키",
"transport_type": "전송 방식",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "여러 거래소를 연동해 경쟁력 있는 환율을 찾는 거래소 애그리게이터입니다.",
"trocador_desc_kyc": "공급자 이름과 함께 KYC 등급이 표시됩니다. 이 등급은 Trocador가 설정하며, 자체 기준에 따라 결정됩니다.",
"trongrid_history": "TronGrid 내역",
### res/values/strings_my.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "သင့် ငွေလွှဲပြောင်းမှုများသည် ဤနေရာတွင် ပေါ်လာပါမည်။",
"transparent_secret_key": "Transparent လျှို့ဝှက်သော့",
"transport_type": "ပို့ဆောင်မှုအမျိုးအစား",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "ယှဉ်ပြိုင်နိုင်သော နှုန်းထားများကို ရှာဖွေရန် အခြေခံ အပြန်အလှန်လဲလှယ်ရေး ပလက်ဖောင်းများ အများအပြားကို အသုံးချသည့် အပြန်အလှန်လဲလှယ်ရေး စုစည်းပေးသူတစ်ခုဖြစ်သည်။",
"trocador_desc_kyc": "ဝန်ဆောင်မှုပေးသူအမည်နှင့်အတူ KYC Rating ကို ပြသထားသည်။ ၎င်းကို Trocador မှ သတ်မှတ်ထားပြီး ၎င်းတို့၏ ကိုယ်ပိုင်စံနှုန်းများအပေါ် အခြေခံထားသည်။",
"trongrid_history": "TronGrid မှတ်တမ်း",
### res/values/strings_nl.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Je transacties verschijnen hier.",
"transparent_secret_key": "Transparante geheime sleutel",
"transport_type": "Transporttype",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "is een exchange-aggregator die meerdere onderliggende exchanges gebruikt om concurrerende tarieven te vinden.",
"trocador_desc_kyc": "Naast de naam van de provider wordt een KYC-rating weergegeven. Deze wordt ingesteld door Trocador en is gebaseerd op hun eigen criteria.",
"trongrid_history": "TronGrid-geschiedenis",
### res/values/strings_pl.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Twoje transakcje pojawią się tutaj.",
"transparent_secret_key": "Przezroczysty klucz tajny",
"transport_type": "Typ transportu",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "to agregator giełd, który wykorzystuje wiele bazowych platform wymiany, aby znaleźć konkurencyjne kursy.",
"trocador_desc_kyc": "Obok nazwy dostawcy wyświetlana jest ocena KYC. Jest ona ustalana przez Trocador i opiera się na jego własnych kryteriach.",
"trongrid_history": "Historia TronGrid",
### res/values/strings_pt.arb
@@ -1378,6 +1378,7 @@
"transactions_will_appear_here": "Suas transações aparecerão aqui.",
"transparent_secret_key": "Chave secreta transparente",
"transport_type": "Tipo de transporte",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "é um agregador de exchanges que utiliza várias exchanges subjacentes para encontrar taxas competitivas.",
"trocador_desc_kyc": "Ao lado do nome do provedor, é exibida uma classificação KYC. Ela é definida pelo Trocador e se baseia nos próprios critérios dele.",
"trongrid_history": "Histórico do TronGrid",
### res/values/strings_pt_BR.arb
@@ -730,6 +730,7 @@
"skip_verification_question": "Você ainda deseja pular a verificação?",
"skip_verification_title": "Tem certeza?",
"skip_verification_warning": "Se você não fizer backup da sua frase de recuperação e perder o acesso à Cake Wallet ou ao seu dispositivo, seus ativos serão perdidos.",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"unsupported_token_requested": "Este pedido de pagamento é para um token que não conseguimos identificar na rede selecionada.",
"networks": "Redes",
"new_first_wallet_text": "Manter sua cripto segura é moleza",
### res/values/strings_ru.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "Ваши транзакции будут отображаться здесь.",
"transparent_secret_key": "Прозрачный секретный ключ",
"transport_type": "Тип транспорта",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "— это агрегатор обменников, который использует несколько базовых бирж для поиска выгодных курсов.",
"trocador_desc_kyc": "Рядом с названием провайдера отображается рейтинг KYC. Он устанавливается Trocador и основан на их собственных критериях.",
"trongrid_history": "История TronGrid",
### res/values/strings_th.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "ธุรกรรมของคุณจะปรากฏที่นี่",
"transparent_secret_key": "คีย์ลับแบบโปร่งใส",
"transport_type": "ประเภทการส่งข้อมูล",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "เป็นตัวรวบรวมการแลกเปลี่ยนที่ใช้ประโยชน์จากแพลตฟอร์มแลกเปลี่ยนหลายแห่งเพื่อค้นหาอัตราที่แข่งขันได้",
"trocador_desc_kyc": "นอกจากชื่อผู้ให้บริการแล้ว ยังมีการแสดงคะแนน KYC ด้วย โดยคะแนนนี้กำหนดโดย Trocador และอิงตามเกณฑ์ของพวกเขาเอง",
"trongrid_history": "ประวัติ TronGrid",
### res/values/strings_tl.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "Dito lalabas ang iyong mga transaksyon.",
"transparent_secret_key": "Transparent na Lihim na Key",
"transport_type": "Uri ng Transportasyon",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "ay isang exchange aggregator na gumagamit ng maraming pinagbabatayang exchange upang makahanap ng mapagkumpitensyang mga rate.",
"trocador_desc_kyc": "Kasama ng pangalan ng provider, ipinapakita ang isang KYC Rating. Itinakda ito ng Trocador at nakabatay sa sarili nilang pamantayan.",
"trongrid_history": "Kasaysayan ng TronGrid",
### res/values/strings_tr.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "İşlemleriniz burada görünecek.",
"transparent_secret_key": "Şeffaf Gizli Anahtar",
"transport_type": "Aktarım Türü",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "rekabetçi oranlar bulmak için birden fazla altta yatan borsadan yararlanan bir borsa toplayıcısıdır.",
"trocador_desc_kyc": "Sağlayıcı adının yanında bir KYC Derecelendirmesi gösterilir. Bu, Trocador tarafından belirlenir ve kendi kriterlerine dayanır.",
"trongrid_history": "TronGrid geçmişi",
### res/values/strings_uk.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "Ваші транзакції з’являться тут.",
"transparent_secret_key": "Прозорий секретний ключ",
"transport_type": "Тип транспорту",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "це агрегатор обміну, який використовує кілька базових бірж, щоб знаходити конкурентні курси.",
"trocador_desc_kyc": "Поруч із назвою постачальника відображається рейтинг KYC. Його встановлює Trocador на основі власних критеріїв.",
"trongrid_history": "Історія TronGrid",
### res/values/strings_ur.arb
@@ -1378,6 +1378,7 @@
"transactions_will_appear_here": "آپ کی ٹرانزیکشنز یہاں ظاہر ہوں گی۔",
"transparent_secret_key": "شفاف خفیہ کلید",
"transport_type": "ٹرانسپورٹ کی قسم",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "ایک ایکسچینج ایگریگیٹر ہے جو مسابقتی نرخ تلاش کرنے کے لیے متعدد بنیادی ایکسچینجز سے فائدہ اٹھاتا ہے۔",
"trocador_desc_kyc": "فراہم کنندہ کے نام کے ساتھ ایک KYC ریٹنگ بھی دکھائی جاتی ہے۔ یہ Trocador کی جانب سے مقرر کی جاتی ہے اور ان کے اپنے معیار پر مبنی ہوتی ہے۔",
"trongrid_history": "TronGrid ہسٹری",
### res/values/strings_vi.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "Các giao dịch của bạn sẽ hiển thị ở đây.",
"transparent_secret_key": "Khóa bí mật minh bạch",
"transport_type": "Loại truyền tải",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "là một công cụ tổng hợp trao đổi, tận dụng nhiều sàn giao dịch khác nhau để tìm ra tỷ giá cạnh tranh.",
"trocador_desc_kyc": "Bên cạnh tên nhà cung cấp, Xếp hạng KYC sẽ được hiển thị. Xếp hạng này do Trocador thiết lập và dựa trên các tiêu chí riêng của họ.",
"trongrid_history": "Lịch sử TronGrid",
### res/values/strings_yo.arb
@@ -1377,6 +1377,7 @@
"transactions_will_appear_here": "Awọn ìdúnàdúrà rẹ yóò hàn níbí.",
"transparent_secret_key": "Kọ́kọ́rọ̀ Aṣírí Transparent",
"transport_type": "Iru Gbigbe",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "jẹ olùkójọ paṣipaarọ tí ó ń lo ọ̀pọ̀ paṣipaarọ abẹ́lẹ̀ láti rí àwọn oṣuwọn tí ó dára jù lọ.",
"trocador_desc_kyc": "Lẹgbẹẹ orúkọ olupese, ìdíwọ̀n KYC kan máa hàn. Trocador ló ń ṣètò èyí, ó sì dá lórí àwọn àdéhùn wọn fúnra wọn.",
"trongrid_history": "Itan TronGrid",
### res/values/strings_zh.arb
@@ -1376,6 +1376,7 @@
"transactions_will_appear_here": "您的交易记录将显示在这里。",
"transparent_secret_key": "透明私钥",
"transport_type": "传输类型",
+ "trezor_locktime_notice": "Your Trezor will ask you to confirm a locktime. This is a privacy feature and does not delay your payment.",
"trocador_desc": "是一个交易所聚合器,利用多个底层交易所来寻找有竞争力的汇率。",
"trocador_desc_kyc": "在提供商名称旁边会显示 KYC 评级。该评级由 Trocador 设定,并基于其自身的评估标准。",
"trongrid_history": "TronGrid 历史",
### scripts/android/app_env.sh
@@ -14,15 +14,15 @@ TYPES=($MONERO_COM $CAKEWALLET)
APP_ANDROID_TYPE=$1
MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="6.4.4"
-MONERO_COM_BUILD_NUMBER=4168
+MONERO_COM_VERSION="6.4.5"
+MONERO_COM_BUILD_NUMBER=4169
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.4"
-CAKEWALLET_BUILD_NUMBER=4424
+CAKEWALLET_VERSION="6.4.5"
+CAKEWALLET_BUILD_NUMBER=4425
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
CAKEWALLET_SCHEME="cakewallet"
### scripts/ios/app_env.sh
@@ -12,13 +12,13 @@ TYPES=($MONERO_COM $CAKEWALLET)
APP_IOS_TYPE=$1
MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="6.4.4"
-MONERO_COM_BUILD_NUMBER=174
+MONERO_COM_VERSION="6.4.5"
+MONERO_COM_BUILD_NUMBER=176
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="6.4.4"
-CAKEWALLET_BUILD_NUMBER=438
+CAKEWALLET_VERSION="6.4.5"
+CAKEWALLET_BUILD_NUMBER=445
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
Why this scored 33/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.