diff --git a/.changeset/angry-apples-study.md b/.changeset/angry-apples-study.md deleted file mode 100644 index 29dbbbda939f..000000000000 --- a/.changeset/angry-apples-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ledger-live-desktop": patch ---- - -Remove Cardano Poolcost diff --git a/.changeset/dull-shrimps-wonder.md b/.changeset/dull-shrimps-wonder.md deleted file mode 100644 index ee8c4b5b4139..000000000000 --- a/.changeset/dull-shrimps-wonder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@ledgerhq/cryptoassets": minor ---- - -Add new data from dynamic CAL diff --git a/.changeset/early-yaks-protect.md b/.changeset/early-yaks-protect.md deleted file mode 100644 index 0389cce78c16..000000000000 --- a/.changeset/early-yaks-protect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@ledgerhq/live-common": patch ---- - -Handle txs without auth_info diff --git a/.changeset/friendly-cycles-watch.md b/.changeset/friendly-cycles-watch.md deleted file mode 100644 index a4d47a70ea94..000000000000 --- a/.changeset/friendly-cycles-watch.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@ledgerhq/types-live": patch -"ledger-live-desktop": patch -"@ledgerhq/live-common": patch ---- - -Add feature_ptx_swap_live_app feature flag and logic diff --git a/.changeset/seven-carrots-join.md b/.changeset/seven-carrots-join.md deleted file mode 100644 index abea665ec5b4..000000000000 --- a/.changeset/seven-carrots-join.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"ledger-live-desktop": minor -"live-mobile": minor -"@ledgerhq/live-common": minor ---- - -Update swap endpoints to v5 on llm and lld diff --git a/.changeset/sixty-carpets-hug.md b/.changeset/sixty-carpets-hug.md deleted file mode 100644 index 7254785e7e35..000000000000 --- a/.changeset/sixty-carpets-hug.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@ledgerhq/cryptoassets": minor -"@ledgerhq/types-live": minor -"ledger-live-desktop": minor -"live-mobile": minor -"@ledgerhq/live-common": minor -"web-tools": minor -"@ledgerhq/live-cli": minor ---- - -Integrate SEI Network diff --git a/.changeset/sixty-comics-double.md b/.changeset/sixty-comics-double.md deleted file mode 100644 index 4a110684b397..000000000000 --- a/.changeset/sixty-comics-double.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"ledger-live-desktop": patch -"@ledgerhq/live-common": patch ---- - -Add entry point to CEX with feature flag diff --git a/.changeset/sixty-cooks-run.md b/.changeset/sixty-cooks-run.md deleted file mode 100644 index f894e56c3525..000000000000 --- a/.changeset/sixty-cooks-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"live-mobile": patch ---- - -Remove Cardano poolCost diff --git a/.changeset/yellow-sloths-pay.md b/.changeset/yellow-sloths-pay.md deleted file mode 100644 index ef4f05de64c4..000000000000 --- a/.changeset/yellow-sloths-pay.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"ledger-live-desktop": patch -"live-mobile": patch -"@ledgerhq/live-common": patch ---- - -Add 'Ledger By Kiln' in the list of Tezos bakers diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index b06fcff1d634..d8def9122589 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,5 +1,39 @@ # @ledgerhq/live-cli +## 22.13.1 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/cryptoassets@11.0.1 + +## 22.13.1-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + - @ledgerhq/live-common@33.0.1-hotfix.2 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + +## 22.13.1-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + - @ledgerhq/live-common@33.0.1-hotfix.1 + +## 22.13.1-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/live-common@33.0.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + ## 22.13.0 ### Minor Changes diff --git a/apps/cli/package.json b/apps/cli/package.json index bad391cc39ea..a763e1e189de 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/live-cli", - "version": "22.13.0", + "version": "22.13.1", "description": "ledger-live CLI version", "repository": { "type": "git", diff --git a/apps/ledger-live-desktop/CHANGELOG.md b/apps/ledger-live-desktop/CHANGELOG.md index d5a7d70fa210..6c7a0b512839 100644 --- a/apps/ledger-live-desktop/CHANGELOG.md +++ b/apps/ledger-live-desktop/CHANGELOG.md @@ -1,5 +1,46 @@ # ledger-live-desktop +## 2.70.1 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1 + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/coin-evm@0.9.0 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/domain-service@1.1.13 + +## 2.70.1-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1-hotfix.2 + - @ledgerhq/coin-evm@0.9.0-hotfix.2 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + - @ledgerhq/domain-service@1.1.13-hotfix.1 + +## 2.70.1-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-evm@0.9.0-hotfix.1 + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + - @ledgerhq/live-common@33.0.1-hotfix.1 + +## 2.70.1-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/live-common@33.0.1-hotfix.0 + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/coin-evm@0.8.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.0 + ## 2.70.0 ### Minor Changes diff --git a/apps/ledger-live-desktop/package.json b/apps/ledger-live-desktop/package.json index 2dc686c6e558..1d73e121d895 100644 --- a/apps/ledger-live-desktop/package.json +++ b/apps/ledger-live-desktop/package.json @@ -13,7 +13,7 @@ "license": "MIT", "private": true, "main": "./.webpack/main.bundle.js", - "version": "2.70.0", + "version": "2.70.1", "scripts": { "start:prod": "electron ./.webpack/main.bundle.js", "start": "cross-env NODE_ENV=development node ./tools/main.js", diff --git a/apps/ledger-live-desktop/static/i18n/ar/app.json b/apps/ledger-live-desktop/static/i18n/ar/app.json index 9ad0e0d4aa07..52c6900eed82 100644 --- a/apps/ledger-live-desktop/static/i18n/ar/app.json +++ b/apps/ledger-live-desktop/static/i18n/ar/app.json @@ -122,6 +122,7 @@ "search" : "جارٍ البحث...", "searchWithoutEllipsis" : "بحث", "manage" : "إدارة", + "tryAgain" : "إعادة المحاولة", "lockScreen" : { "title" : "مرحباً بك مجدداً", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "تلقي الأصول المشفرة في محفظتك" } } + }, + "getFundsModal" : { + "text" : "احصل على {{coin}} للتكديس", + "description" : "قم بشراء أو مبادلة أو تلقى الأصول المشفرة مباشرةً إلى جهازك Ledger باستخدام Ledger Live." } }, "lottieDebugger" : { @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "افتح تطبيق {{wording}} على جهازك", "allowAppPermissionSubtitleToken" : "لإدارة رموزك {{token}}", - "allowManagerPermission" : "السماح بــ {{wording}} على جهازك", + "allowManagerPermission" : "اسمح بمدير Ledger على جهازك", + "allowRenaming" : "اسمح بإعادة التسمية على جهازك", "loading" : "جاري التحميل...", "connectAndUnlockDevice" : "قم بتوصيل جهازك وإلغاء قفله", "unlockDevice" : "قم بإلغاء قفل جهازك", @@ -4061,7 +4067,7 @@ "downloadProgress" : "اكتمل {{progress}}%", "checking" : "جاري التحقق من التحديث...", "checkSuccess" : "متاح تحديث Ledger Live جديد، سيتم تثبيته تلقائياً عندما تغلق التطبيق", - "quitAndInstall" : "تثبيت الآن", + "quitAndInstall" : "تثبيت الآن وإعادة الإطلاق", "updateAvailable" : "التحديث إلى إصدار {{version}} من Ledger Live متاح", "error" : "حدث خطأ أثناء التحديث. يرجى التنزيل مرة أخرى", "reDownload" : "التنزيل مرة أخرى", @@ -5077,12 +5083,12 @@ "description" : "يرجى إعادة المحاولة." }, "DisconnectedDevice" : { - "title" : "عذراً، يبدو أنه قد انقطع الاتصال عن جهازك", - "description" : "يرجى إعادة الاتصال والمحاولة مرة أخرى." + "title" : "الجهاز غير متصل", + "description" : "Ledger Live لم يتمكن من الاتصال بجهازك. يرجى إعادة المحاولة." }, "DisconnectedDeviceDuringOperation" : { - "title" : "عذراً، يبدو أنه قد انقطع الاتصال عن جهازك", - "description" : "يرجى إعادة الاتصال والمحاولة مرة أخرى." + "title" : "الجهاز غير متصل", + "description" : "Ledger Live لم يتمكن من الاتصال بجهازك. يرجى إعادة المحاولة." }, "EConnReset" : { "title" : "لا يمكن الوصول إلى متجر تطبيقات Ledger", @@ -5310,6 +5316,10 @@ "title" : "تم رفض الإجراء", "description" : "رفض المستخدم العملية على الجهاز" }, + "ExpertModeRequired" : { + "title" : "وضع الخبير مطلوب", + "description" : "يجب تمكين وضع الخبير." + }, "TransactionRefusedOnDevice" : { "title" : "تم رفض العملية على الجهاز", "description" : "يرجى إعادة المحاولة أو التواصل مع دعم Ledger إذا كان لديك شك" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "حذف", "steps" : { "choose" : { - "stepLabel" : "اختر صورة", + "stepLabel" : "اختر الصورة", "description" : "اختر صورة لتعيينها على أنها (...)", "pickFromNftGallery" : "اختر من معرض NFT", "myNfts" : "رموزي غير القابلة للاستبدال", - "upload" : "تحميل من الكمبيوتر الخاص بي", + "upload" : "تحميل من الكمبيوتر", "chooseNft" : "اختر رمزاً غير قابل للاستبدال", "remove" : "إزالة الصورة الحالية", "selectNft" : "اختر رمز غير قابل للاستبدال", - "previousSelectNft" : "عودة", "nftEmptyStateTitle" : "ليس هناك رموز غير قابلة للاستبدال بعد لعرضها", "nftEmptyStateDescription" : "ابدأ بإضافة رموز غير قابلة للاستبدال إلى محفظتك." }, "adjust" : { - "stepLabel" : "ضبط الصورة", - "rotate" : "تدوير" + "stepLabel" : "قص", + "rotate" : "تدوير", + "confirmCrop" : "تأكيد القص" }, "contrast" : { - "stepLabel" : "اختر التباين" + "stepLabel" : "تعيين التباين", + "confirmContrast" : "تأكيد التباين" }, "transfer" : { - "stepLabel" : "تحويل", - "uploadAnotherImage" : "قم بتحميل صورة أخرى", - "allowPreview" : "اسمح لصورة شاشة القَفل بالتحميل على {{productName}} الخاص بك", + "stepLabel" : "تحميل", + "useAnotherPicture" : "تحميل صورة أخرى", + "allowPreview" : "انقر على \"Load picture [تحميل الصورة]\" لتخصيص شاشة القفل", "allowConfirmPreview" : "السماح باستعادة صورة شاشة القفل على {{productName}}", "loadingPicture" : "جاري التحميل ...", + "voila" : "ها هي!", "imageLoaded" : "تم تحميل الصورة على {{productName}}", "confirmPicture" : "يُعجبك ما تراه؟\nاحتفظ بها!", "confirmRestorePicture" : "تأكيد استعادة صورة شاشة القفل", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "تخصيص جهازي", - "description" : "عبر تخصيص الشاشة", + "title" : "قم بتخصيص شاشة القَفل", + "description" : "اختر أي رمز غير قابل للاستبدال أو صورة لتعيينها كشاشة قَفل Ledger Stax الخاص بك.", "actionCompletedPopupLabel" : "تم تخصيص الجهاز" }, - "customImageSet" : "تم تعيين شاشة القَفل", - "finishCTA" : "إنهاء" + "customImageSet" : "تم تخصيص شاشة القَفل", + "finishCTA" : "إغلاق" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "خطأ في الشبكة", "subtitle" : "حدث خطأ ما. يُرجى إعادة المحاولة. إذا استمرت المشكلة، احفظ السجل وتواصل مع دعم Ledger.", - "tryAgain" : "أعد المحاولة", "contactSupport" : "تواصل مع دعم Ledger", "saveLog" : "حفظ السجل" } diff --git a/apps/ledger-live-desktop/static/i18n/de/app.json b/apps/ledger-live-desktop/static/i18n/de/app.json index 5c3f22ec5431..b33843735f65 100644 --- a/apps/ledger-live-desktop/static/i18n/de/app.json +++ b/apps/ledger-live-desktop/static/i18n/de/app.json @@ -122,6 +122,7 @@ "search" : "Suche...", "searchWithoutEllipsis" : "Suchen nach", "manage" : "Verwalten", + "tryAgain" : "Wiederholen", "lockScreen" : { "title" : "Willkommen zurück", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "Empfangen Sie Kryptowährungen in Ihrer Wallet" } } + }, + "getFundsModal" : { + "text" : "Holen Sie sich {{coin}} zum Staken", + "description" : "Kaufen, tauschen oder empfangen Sie Kryptowährungen mit Ledger Live direkt auf Ihrem Ledger-Gerät." } }, "lottieDebugger" : { @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "Öffnen Sie die {{wording}} App auf Ihrem Gerät", "allowAppPermissionSubtitleToken" : "zum Verwalten Ihrer {{token}}-Tokens", - "allowManagerPermission" : "Erlauben Sie {{wording}} auf Ihrem Gerät", + "allowManagerPermission" : "Ledger Manager auf Ihrem Gerät zulassen", + "allowRenaming" : "Umbenennen auf Ihrem Gerät zulassen", "loading" : "Lade Daten...", "connectAndUnlockDevice" : "Verbinden und entsperren Sie Ihr Gerät", "unlockDevice" : "Entsperren Sie Ihr Gerät", @@ -4061,7 +4067,7 @@ "downloadProgress" : "{{progress}}% abgeschlossen", "checking" : "Prüfen des Updates ...", "checkSuccess" : "Ein neues Update für Ledger Live ist verfügbar. Es wird automatisch installiert, wenn Sie die App schließen", - "quitAndInstall" : "Jetzt installieren", + "quitAndInstall" : "Jetzt installieren und neu starten", "updateAvailable" : "Update auf Ledger Live Version {{version}} ist verfügbar", "error" : "Fehler beim Update. Bitte erneut herunterladen", "reDownload" : "Erneut herunterladen", @@ -5077,12 +5083,12 @@ "description" : "Bitte versuchen Sie es erneut." }, "DisconnectedDevice" : { - "title" : "Entschuldigung, es scheint Ihr Gerät ist nicht verbunden", - "description" : "Bitte neu verbinden und erneut versuchen." + "title" : "Gerät nicht verbunden", + "description" : "Ledger Live konnte keine Verbindung zu Ihrem Gerät herstellen. Bitte versuchen Sie es erneut." }, "DisconnectedDeviceDuringOperation" : { - "title" : "Entschuldigung, es scheint Ihr Gerät ist nicht verbunden", - "description" : "Bitte neu verbinden und erneut versuchen." + "title" : "Gerät nicht verbunden", + "description" : "Ledger Live konnte keine Verbindung zu Ihrem Gerät herstellen. Bitte versuchen Sie es erneut." }, "EConnReset" : { "title" : "Der Ledger Application Store kann nicht erreicht werden", @@ -5310,6 +5316,10 @@ "title" : "Aktion abgelehnt", "description" : "Der Benutzer hat die Aktion am Gerät abgelehnt" }, + "ExpertModeRequired" : { + "title" : "Expertenmodus erforderlich", + "description" : "Der Expertenmodus muss aktiviert werden." + }, "TransactionRefusedOnDevice" : { "title" : "Aktion auf Gerät verweigert", "description" : "Bitte versuchen Sie es erneut oder kontaktieren Sie im Zweifelsfall den Ledger-Support" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "Entfernen", "steps" : { "choose" : { - "stepLabel" : "Wählen Sie ein Bild aus", + "stepLabel" : "Bild auswählen", "description" : "Wählen Sie ein Bild, das als (...) festgelegt werden soll", "pickFromNftGallery" : "Aus meiner NFT-Galerie auswählen", "myNfts" : "Meine NFTs", - "upload" : "Von meinem Computer hochladen", + "upload" : "Vom Computer hochladen", "chooseNft" : "Wählen Sie ein NFT", "remove" : "Aktuelles Bild entfernen", "selectNft" : "NFT wählen", - "previousSelectNft" : "Zurück", "nftEmptyStateTitle" : "Es können noch keine NFTs angezeigt werden", "nftEmptyStateDescription" : "Fügen Sie NFTs zu Ihrer Wallet hinzu, um loszulegen." }, "adjust" : { - "stepLabel" : "Bild anpassen", - "rotate" : "Drehen" + "stepLabel" : "Zuschneiden", + "rotate" : "Drehen", + "confirmCrop" : "Ausschnitt bestätigen" }, "contrast" : { - "stepLabel" : "Kontrast auswählen" + "stepLabel" : "Kontrast einstellen", + "confirmContrast" : "Kontrast bestätigen" }, "transfer" : { - "stepLabel" : "Übertragen", - "uploadAnotherImage" : "Ein weiteres Bild hochladen", - "allowPreview" : "Erlauben Sie das Laden eines Bildes im Sperrbildschirm auf Ihrem {{productName}}", + "stepLabel" : "Laden", + "useAnotherPicture" : "Ein weiteres Bild hochladen", + "allowPreview" : "Tippen Sie auf „Load picture“ (Bild laden), um den Sperrbildschirm anzupassen", "allowConfirmPreview" : "Wiederherstellung des Sperrbildschirmbildes auf {{productName}} erlauben", "loadingPicture" : "Lade Daten...", + "voila" : "Voilà!", "imageLoaded" : "Bild geladen auf {{productName}}", "confirmPicture" : "Gefällt Ihnen, was Sie sehen?\nBehalten Sie es!", "confirmRestorePicture" : "Wiederherstellung des Sperrbildschirmbildes bestätigen", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Mein Gerät personalisieren", - "description" : "Durch Anpassen des Bildschirms", + "title" : "Passen Sie den Sperrbildschirm an", + "description" : "Wählen Sie ein beliebiges NFT oder Bild, das Sie als Sperrbildschirm Ihres Ledger Stax festlegen möchten.", "actionCompletedPopupLabel" : "Gerät personalisiert" }, - "customImageSet" : "Sperrbildschirm festgelegt", - "finishCTA" : "Beenden" + "customImageSet" : "Sperrbildschirm angepasst", + "finishCTA" : "Schließen" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "Netzwerkfehler", "subtitle" : "Das hat leider nicht funktioniert. Bitte versuchen Sie es noch einmal. Wenn das Problem weiterhin besteht, speichern Sie Ihre Logdatei und kontaktieren Sie den Ledger-Kundenservice.", - "tryAgain" : "Wiederholen", "contactSupport" : "Ledger-Kundenservice kontaktieren", "saveLog" : "Log speichern" } diff --git a/apps/ledger-live-desktop/static/i18n/es/app.json b/apps/ledger-live-desktop/static/i18n/es/app.json index 14fbe5c75f20..0f2d047d50cc 100644 --- a/apps/ledger-live-desktop/static/i18n/es/app.json +++ b/apps/ledger-live-desktop/static/i18n/es/app.json @@ -122,6 +122,7 @@ "search" : "Buscar...", "searchWithoutEllipsis" : "Buscar", "manage" : "Administrar", + "tryAgain" : "Inténtalo de nuevo", "lockScreen" : { "title" : "Bienvenidos", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "Recibe cripto en tu billetera" } } + }, + "getFundsModal" : { + "text" : "Consigue {{coin}} para poner en participación", + "description" : "Compra, permuta o recibe cripto directamente en tu Ledger mediante Ledger Live." } }, "lottieDebugger" : { @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "Abre la aplicación {{wording}} en tu dispositivo", "allowAppPermissionSubtitleToken" : "para administrar los tokens {{token}}", - "allowManagerPermission" : "Permite {{wording}} en tu dispositivo", + "allowManagerPermission" : "Permitir Ledger Manager en tu dispositivo", + "allowRenaming" : "Permitir renombrar en tu dispositivo", "loading" : "Cargando...", "connectAndUnlockDevice" : "Conecta y desbloquea tu dispositivo", "unlockDevice" : "Desbloquea tu dispositivo", @@ -4061,7 +4067,7 @@ "downloadProgress" : "{{progress}}% completado", "checking" : "Comprobando actualización...", "checkSuccess" : "Nueva actualización de Ledger Live disponible, se instalará automáticamente cuando cierres la aplicación.", - "quitAndInstall" : "Instalar ahora", + "quitAndInstall" : "Instalar ahora y reiniciar", "updateAvailable" : "Se encuentra disponible la actualización a la versión {{version}} de Ledger Live", "error" : "Error durante la actualización. Descárgala de nuevo", "reDownload" : "Descargar de nuevo", @@ -5077,12 +5083,12 @@ "description" : "Inténtalo de nuevo." }, "DisconnectedDevice" : { - "title" : "Parece que tu dispositivo se ha desconectado", - "description" : "Conéctalo e inténtalo de nuevo." + "title" : "Dispositivo desconectado", + "description" : "Ledger Live no se pudo conectar a tu dispositivo. Inténtalo de nuevo." }, "DisconnectedDeviceDuringOperation" : { - "title" : "Parece que tu dispositivo se ha desconectado", - "description" : "Conéctalo e inténtalo de nuevo." + "title" : "Dispositivo desconectado", + "description" : "Ledger Live no se pudo conectar a tu dispositivo. Inténtalo de nuevo." }, "EConnReset" : { "title" : "No se puede establecer contacto con la tienda de aplicaciones de Ledger", @@ -5310,6 +5316,10 @@ "title" : "Acción rechazada", "description" : "El usuario rechazó la operación en el dispositivo" }, + "ExpertModeRequired" : { + "title" : "Se requiere el modo Experto", + "description" : "Es necesario activar el modo Experto." + }, "TransactionRefusedOnDevice" : { "title" : "Operación denegada en el dispositivo", "description" : "Inténtalo de nuevo o contacta al Soporte de Ledger si tienes dudas" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "Eliminar", "steps" : { "choose" : { - "stepLabel" : "Elige una imagen", + "stepLabel" : "Elegir imagen", "description" : "Elige una imagen para establecerla como (...)", "pickFromNftGallery" : "Elegir de la galería de NFTs", "myNfts" : "Mis NFTs", - "upload" : "Cargar desde mi PC", + "upload" : "Cargar desde PC", "chooseNft" : "Elige un NFT", "remove" : "Eliminar imagen actual", "selectNft" : "Elegir NFT", - "previousSelectNft" : "Atrás", "nftEmptyStateTitle" : "Todavía no hay NFTs para mostrar", "nftEmptyStateDescription" : "Empieza agregando NFTs a tu billetera." }, "adjust" : { - "stepLabel" : "Ajustar imagen", - "rotate" : "Girar" + "stepLabel" : "Recortar", + "rotate" : "Girar", + "confirmCrop" : "Confirmar recorte" }, "contrast" : { - "stepLabel" : "Elegir contraste" + "stepLabel" : "Ajustar contraste", + "confirmContrast" : "Confirmar contraste" }, "transfer" : { - "stepLabel" : "Transferir", - "uploadAnotherImage" : "Cargar otra imagen", - "allowPreview" : "Permite que la imagen de la pantalla de bloqueo se cargue en tu {{productName}}", + "stepLabel" : "Cargar", + "useAnotherPicture" : "Cargar otra imagen", + "allowPreview" : "Toca “Cargar imagen” para personalizar la pantalla de bloqueo.", "allowConfirmPreview" : "Permitir la restauración de la imagen de pantalla de bloqueo en {{productName}}", "loadingPicture" : "Cargando...", + "voila" : "¡Voilà!", "imageLoaded" : "Imagen cargada en {{productName}}", "confirmPicture" : "¿Te gusta lo que ves?\n¡Pues consérvalo!", "confirmRestorePicture" : "Confirmar la restauración de la imagen de pantalla de bloqueo", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Personalizar mi dispositivo", - "description" : "adaptando la pantalla a mis necesidades", + "title" : "Personalizar la pantalla de bloqueo", + "description" : "Elige el NFT o la imagen que quieres usar como pantalla de bloqueo de tu Ledger Stax.", "actionCompletedPopupLabel" : "Dispositivo personalizado" }, - "customImageSet" : "Pantalla de bloqueo establecida", - "finishCTA" : "Finalizar" + "customImageSet" : "Pantalla de bloqueo personalizada", + "finishCTA" : "Cerrar" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "Error de red", "subtitle" : "Algo ha salido mal. Inténtalo de nuevo. Si el problema persiste, guarda el registro y ponte en contacto con el Soporte de Ledger.", - "tryAgain" : "Inténtalo de nuevo", "contactSupport" : "Ponte en contacto con el Soporte de Ledger", "saveLog" : "Guardar registro" } diff --git a/apps/ledger-live-desktop/static/i18n/fr/app.json b/apps/ledger-live-desktop/static/i18n/fr/app.json index 21554bc88761..24c51056e4f8 100644 --- a/apps/ledger-live-desktop/static/i18n/fr/app.json +++ b/apps/ledger-live-desktop/static/i18n/fr/app.json @@ -122,6 +122,7 @@ "search" : "Rechercher...", "searchWithoutEllipsis" : "Rechercher", "manage" : "Gérer", + "tryAgain" : "Réessayer", "lockScreen" : { "title" : "Bienvenue", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "Recevez des cryptos dans votre wallet." } } + }, + "getFundsModal" : { + "text" : "Recevez des {{coin}} pour staker", + "description" : "Achetez, échangez ou recevez des cryptos directement sur votre appareil Ledger via Ledger Live." } }, "lottieDebugger" : { @@ -1280,7 +1285,7 @@ }, "postOnboardingBanner" : { "title" : "Que faire ensuite avec votre Ledger Stax ?", - "description" : "Demandez votre NFT Infinity Pass, personnalisez\n l’écran de verrouillage ou transférez vos actifs.", + "description" : "Demandez votre NFT Infinity Pass, personnalisez\n le fond d’écran ou transférez vos actifs.", "link" : "Découvrir la suite" } }, @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "Ouvrez l’app {{wording}} sur votre appareil", "allowAppPermissionSubtitleToken" : "pour gérer vos tokens {{token}}", - "allowManagerPermission" : "Autorisez {{wording}} sur votre appareil.", + "allowManagerPermission" : "Autorisez la connexion sécurisée sur votre appareil", + "allowRenaming" : "Autorisez le changement de nom sur votre appareil", "loading" : "Chargement...", "connectAndUnlockDevice" : "Connectez et déverrouillez votre appareil.", "unlockDevice" : "Déverrouillez votre appareil.", @@ -4061,7 +4067,7 @@ "downloadProgress" : "{{progress}} % terminés", "checking" : "Vérification de la mise à jour...", "checkSuccess" : "Nouvelle mise à jour de Ledger Live disponible. Elle s’installera automatiquement à la fermeture de l’application.", - "quitAndInstall" : "Installer maintenant", + "quitAndInstall" : "Installer maintenant et relancer", "updateAvailable" : "Mise à jour disponible vers la version Ledger Live {{version}}", "error" : "Erreur lors de la mise à jour. Merci de recommencer le téléchargement.", "reDownload" : "Recommencer le téléchargement", @@ -5077,12 +5083,12 @@ "description" : "Veuillez réessayer." }, "DisconnectedDevice" : { - "title" : "Votre appareil semble avoir été déconnecté.", - "description" : "Reconnectez votre appareil et réessayez." + "title" : "Appareil déconnecté", + "description" : "Ledger Live n’a pas pu se connecter à votre appareil. Veuillez réessayer." }, "DisconnectedDeviceDuringOperation" : { - "title" : "Votre appareil semble avoir été déconnecté.", - "description" : "Reconnectez votre appareil et réessayez." + "title" : "Appareil déconnecté", + "description" : "Ledger Live n’a pas pu se connecter à votre appareil. Veuillez réessayer." }, "EConnReset" : { "title" : "Impossible d’accéder au Catalogue d’apps de Ledger", @@ -5167,7 +5173,7 @@ "ManagerQuitPage" : { "install" : { "title" : "Finir l’installation de l’application en cours ?", - "description" : "Sortir de My Ledger interrompra l’installation de l’application. Merci de finir l’installation pour installer les applications dans la file d’attente.", + "description" : "Sortir de My Ledger interrompra l’installation de l’application. Pour installer les applications dans la file d’attente, veuillez rester dans My Ledger et finir l’installation.", "stay" : "Finir l’installation" }, "uninstall" : { @@ -5310,6 +5316,10 @@ "title" : "Action rejetée", "description" : "Vous avez refusé l’opération sur votre appareil." }, + "ExpertModeRequired" : { + "title" : "Mode Expert requis", + "description" : "Veuillez activer le mode Expert." + }, "TransactionRefusedOnDevice" : { "title" : "Opération refusée sur l’appareil", "description" : "Veuillez réessayer ou contacter l’Assistance Ledger." @@ -5699,8 +5709,8 @@ "description" : "Si ce fond d’écran ne vous plaît pas, choisissez une autre image." }, "ImageDoesNotExistOnDevice" : { - "title" : "Aucun fond d’écran de verrouillage à supprimer sur votre Ledger Stax", - "description" : "Vous avez déjà supprimé votre fond d’écran de verrouillage." + "title" : "Aucun fond d’écran à supprimer sur votre Ledger Stax", + "description" : "Vous avez déjà supprimé votre fond d’écran." }, "RestoreImageCommitRefusedOnDevice" : { "title" : "Restauration du fond d’écran annulée sur votre Ledger Stax", @@ -5789,37 +5799,39 @@ } }, "customImage" : { - "title" : "Écran de verrouillage personnalisé", - "cta" : "Écran de verrouillage personnalisé", + "title" : "Fond d’écran personnalisé", + "cta" : "Fond d’écran personnalisé", "managerCTA" : "Fond d’écran", "managerCTARemove" : "Retirer", "steps" : { "choose" : { - "stepLabel" : "Choisissez une image", + "stepLabel" : "Image", "description" : "Choisir une image à définir comme (...)", "pickFromNftGallery" : "Sélectionner depuis ma galerie de NFT", "myNfts" : "Mes NFT", - "upload" : "Télécharger à partir de mon ordinateur", + "upload" : "Télécharger à partir de l’ordinateur", "chooseNft" : "Choisir un NFT", "remove" : "Supprimer le fond d’écran", "selectNft" : "Choisir ce NFT", - "previousSelectNft" : "Retour", "nftEmptyStateTitle" : "Pas (encore) de NFT", "nftEmptyStateDescription" : "Commencez par ajouter des NFT à votre wallet." }, "adjust" : { - "stepLabel" : "Ajuster l’image", - "rotate" : "Pivoter" + "stepLabel" : "Recadrage", + "rotate" : "Pivoter", + "confirmCrop" : "Confirmer le recadrage" }, "contrast" : { - "stepLabel" : "Choisissez un contraste" + "stepLabel" : "Contraste", + "confirmContrast" : "Confirmer le contraste" }, "transfer" : { - "stepLabel" : "Transfert", - "uploadAnotherImage" : "Télécharger une autre image", - "allowPreview" : "Autorisez le chargement du fond d’écran sur votre {{productName}}", + "stepLabel" : "Chargement", + "useAnotherPicture" : "Télécharger un autre fond d’écran", + "allowPreview" : "Appuyez sur Charger pour personnaliser le fond d’écran", "allowConfirmPreview" : "Autorisez la restauration du fond d’écran sur {{productName}}.", "loadingPicture" : "Chargement...", + "voila" : "Voilà !", "imageLoaded" : "Image chargée sur votre {{productName}}", "confirmPicture" : "C’est parfait ?\nValidez !", "confirmRestorePicture" : "Confirmez la restauration du fond d’écran.", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Personnaliser mon appareil", - "description" : "Avec un fond d’écran unique", + "title" : "Personnaliser le fond d’écran", + "description" : "Choisissez votre NFT ou image préféré comme fond d’écran de votre Ledger Stax.", "actionCompletedPopupLabel" : "Appareil personnalisé" }, - "customImageSet" : "Écran de verrouillage défini", - "finishCTA" : "Terminer" + "customImageSet" : "Fond d’écran personnalisé", + "finishCTA" : "Fermer" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "Erreur réseau", "subtitle" : "Une erreur est survenue. Veuillez réessayer. Si le problème persiste, enregistrez votre log et contactez l’Assistance Ledger.", - "tryAgain" : "Réessayer", "contactSupport" : "Contacter l’Assistance Ledger", "saveLog" : "Enregistrer le log" } diff --git a/apps/ledger-live-desktop/static/i18n/ja/app.json b/apps/ledger-live-desktop/static/i18n/ja/app.json index ee58980f2aed..5d32c8aa15e3 100644 --- a/apps/ledger-live-desktop/static/i18n/ja/app.json +++ b/apps/ledger-live-desktop/static/i18n/ja/app.json @@ -122,6 +122,7 @@ "search" : "検索…", "searchWithoutEllipsis" : "検索", "manage" : "管理", + "tryAgain" : "再試行", "lockScreen" : { "title" : "おかえりなさい", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "ウォレットで暗号資産を受け取る" } } + }, + "getFundsModal" : { + "text" : "{{coin}}を入手してステーキング", + "description" : "Ledger Liveを使用すると、Ledgerで暗号資産の直接購入、スワップ、受け取りができます。" } }, "lottieDebugger" : { @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "デバイスで{{wording}} アプリを開く", "allowAppPermissionSubtitleToken" : "{{token}} トークンを管理", - "allowManagerPermission" : "デバイス上で{{wording}}を許可", + "allowManagerPermission" : "デバイスでLedger Managerを許可する", + "allowRenaming" : "デバイスで名前の変更を許可する", "loading" : "読み込み中...", "connectAndUnlockDevice" : "デバイスを接続してロックを解除する", "unlockDevice" : "デバイスのロックを解除する", @@ -3871,7 +3877,7 @@ "analytics" : "アナリティクス", "analyticsDesc" : "Ledgerがユーザーエクスペリエンスを改善できるよう、アナリティクスを有効にしてください。クリック、ページの閲覧、リダイレクト、アクション(送金、着金、ロックなど)、ページ末へのスクロール、アプリの(アン)インストール、アプリのバージョン、アカウント数、暗号資産と操作、セッションの持続時間、Ledgerデバイスの種類とファームウェアが含まれます。", "reportErrors" : "バグレポート", - "reportErrorsDesc" : "製品の向上に役立つレポートを、Ledgerに自動的に送信します。", + "reportErrorsDesc" : "製品の向上に役立つレポートを、Ledgerに自動的に送信する。", "launchOnboarding" : "デバイスの設定", "launchOnboardingDesc" : "新しいデバイスをセットアップ、または既存のデバイスを復元する。アカウントと設定はそのまま保持されます。" }, @@ -4061,7 +4067,7 @@ "downloadProgress" : "{{progress}}%完了", "checking" : "アップデートの確認中...", "checkSuccess" : "新しいLedger Liveアップデートをご利用いただけます。アプリを終了すると自動的にインストールされます。", - "quitAndInstall" : "今すぐインストールする", + "quitAndInstall" : "今すぐインストールして再起動する", "updateAvailable" : "Ledger Liveバージョン {{version}} へのアップデートが利用可能です。", "error" : "更新中にエラーが発生再度ダウンロードしてください", "reDownload" : "再度ダウンロード", @@ -5077,12 +5083,12 @@ "description" : "もう一度お試しください。" }, "DisconnectedDevice" : { - "title" : "デバイスの接続が切断されているようです。", - "description" : "デバイスを再接続して、もう一度お試しください。" + "title" : "デバイスが切断されました", + "description" : "Ledger Liveはデバイスに接続できませんでした。もう一度お試しください。" }, "DisconnectedDeviceDuringOperation" : { - "title" : "デバイスの接続が切断されているようです。", - "description" : "デバイスを再接続して、もう一度お試しください。" + "title" : "デバイスが切断されました", + "description" : "Ledger Liveはデバイスに接続できませんでした。もう一度お試しください。" }, "EConnReset" : { "title" : "Ledgerアプリケーションストアに到達できません", @@ -5310,6 +5316,10 @@ "title" : "アクションが拒否されました。", "description" : "デバイス上で操作を拒否しました。" }, + "ExpertModeRequired" : { + "title" : "エキスパートモードが必要です", + "description" : "エキスパートモードを有効にする必要があります。" + }, "TransactionRefusedOnDevice" : { "title" : "デバイス上で操作が却下されました。", "description" : "再試行するか、疑わしい場合はLedgerサポートにお問い合わせください。" @@ -5795,7 +5805,7 @@ "managerCTARemove" : "削除", "steps" : { "choose" : { - "stepLabel" : "画像を選択してください", + "stepLabel" : "画像を選択", "description" : "(...) として設定する画像を選択", "pickFromNftGallery" : "NFTギャラリーから選択", "myNfts" : "私のNFT", @@ -5803,23 +5813,25 @@ "chooseNft" : "NFTを選択", "remove" : "現在の画像を削除する", "selectNft" : "NFTを選択", - "previousSelectNft" : "戻る", "nftEmptyStateTitle" : "表示できるNFTがありません", "nftEmptyStateDescription" : "NFTをウォレットに追加して始めます。" }, "adjust" : { - "stepLabel" : "画像を調整", - "rotate" : "回転" + "stepLabel" : "クロップ", + "rotate" : "回転", + "confirmCrop" : "トリミングを確定" }, "contrast" : { - "stepLabel" : "コントラストを選択" + "stepLabel" : "コントラストを設定", + "confirmContrast" : "コントラストを確定" }, "transfer" : { - "stepLabel" : "送金", - "uploadAnotherImage" : "他の画像をアップロードする", - "allowPreview" : "{{productName}}でのロック画面の画像の読み込みを許可します", + "stepLabel" : "読み込む", + "useAnotherPicture" : "別の写真をアップロード", + "allowPreview" : "「Load picture(画像を読み込む)」をタップしてロック画面をカスタマイズ", "allowConfirmPreview" : "{{productName}}でロック画面の画像の復元を許可する", "loadingPicture" : "読み込み中...", + "voila" : "これで完了です!", "imageLoaded" : "{{productName}}に画像が読み込まれました", "confirmPicture" : "気に入りましたか?\n", "confirmRestorePicture" : "ロック画面の画像の復元を確定する", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Ledgerデバイスをパーソナライズ", - "description" : "画面をカスタマイズ", + "title" : "ロック画面をカスタマイズ", + "description" : "Ledger Staxのロック画面として設定するNFTまたは写真を選択する。", "actionCompletedPopupLabel" : "デバイスがパーソナライズされました" }, - "customImageSet" : "スクリーン設定をロック", - "finishCTA" : "終了する" + "customImageSet" : "ロック画面がカスタマイズされました", + "finishCTA" : "閉じる" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "ネットワークエラー", "subtitle" : "何か問題が発生しました。もう一度お試しください。問題が解決しない場合は、ログを保存し、Ledgerサポートにご連絡ください。", - "tryAgain" : "再試行", "contactSupport" : "Ledgerサポートへ問い合わせ", "saveLog" : "ログを保存" } diff --git a/apps/ledger-live-desktop/static/i18n/ko/app.json b/apps/ledger-live-desktop/static/i18n/ko/app.json index 15c545e23b26..99419fee86c1 100644 --- a/apps/ledger-live-desktop/static/i18n/ko/app.json +++ b/apps/ledger-live-desktop/static/i18n/ko/app.json @@ -122,6 +122,7 @@ "search" : "검색 중...", "searchWithoutEllipsis" : "검색", "manage" : "관리", + "tryAgain" : "다시 시도하세요", "lockScreen" : { "title" : "다시 돌아오신 것을 환영합니다.", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "본인 지갑에서 암호화폐 수령" } } + }, + "getFundsModal" : { + "text" : "{{coin}} 코인을 스테이킹하세요", + "description" : "Ledger Live를 사용해 Ledger로 직접 암호화폐를 구매, 스왑, 수령하세요." } }, "lottieDebugger" : { @@ -561,7 +566,7 @@ "modal" : { "title" : "Ledger Vault 연결하기", "info" : "아래 필드를 작성하여 Ledger Vault 워크스페이스 계정을 연결하고 Ledger Live에서 트랜잭션을 생성하세요. 설정 > 외부 지갑 서명인에서 정보를 찾으세요.", - "info_link" : "Learn more", + "info_link" : "자세히 알아보기", "host" : { "title" : "URL 엔드포인트", "placeholder" : "ws://localhost:3030" @@ -572,9 +577,9 @@ }, "token" : { "title" : "운영자 API 토큰", - "placeholder" : "Token" + "placeholder" : "토큰" }, - "submit" : "Connect" + "submit" : "연결" } }, "fullNode" : { @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "내 장치에서 {{wording}} 앱 열기", "allowAppPermissionSubtitleToken" : "나의 {{token}} 토큰 관리", - "allowManagerPermission" : "장치에서 {{wording}} 허용", + "allowManagerPermission" : "장치에서 Ledger 관리자를 허용하세요", + "allowRenaming" : "장치에서 이름 변경을 허용하세요", "loading" : "로딩...", "connectAndUnlockDevice" : "장치를 연결하고 잠금 해제하세요", "unlockDevice" : "장치를 잠금 해제하세요", @@ -2934,7 +2940,7 @@ } }, "amount" : { - "title" : "Amount" + "title" : "금액" }, "validator" : { "title" : "검증인" @@ -3006,7 +3012,7 @@ "newDelegation" : "새로운 위임", "chooseValidator" : "검증인 선택", "warning" : "다시 마음이 바뀌어 새로운 검증인 교체하고 재위임하려면 <0>{{numberOfDays}}일을 기다려야 합니다", - "amountLabel" : "Amount to redelegate" + "amountLabel" : "재위임할 금액" }, "device" : { "title" : "장치" @@ -3790,7 +3796,7 @@ "button" : "완료", "title" : "모바일로 내보내려면 스캔해주세요", "listTitle" : "Ledger Live 모바일 앱에서:", - "step1" : "Tap the + button in accounts", + "step1" : "+ 버튼을 계정에서 누르세요", "step2" : "데스크탑 계정 가져오기를 탭하세요", "step3" : "100% 로딩될 때까지 LiveQR 코드 를 스캔하세요" } @@ -4061,7 +4067,7 @@ "downloadProgress" : "{{progress}}% 완료됨", "checking" : "업데이트 확인 중...", "checkSuccess" : "새로운 Ledger Live 업데이트가 있습니다. 앱을 닫으면 자동으로 설치됩니다.", - "quitAndInstall" : "지금 설치", + "quitAndInstall" : "지금 설치하고 다시 시작하기", "updateAvailable" : "Ledger Live {{version}} 버전을 업데이트할 수 있습니다", "error" : "업데이트 중 오류가 발생했습니다. 다시 다운로드하세요", "reDownload" : "다시 다운로드", @@ -5077,12 +5083,12 @@ "description" : "다시 시도해 주세요." }, "DisconnectedDevice" : { - "title" : "죄송하지만 장치 연결이 해제된 것 같습니다", - "description" : "다시 연결하여 재시도해주세요." + "title" : "장치 연결 해제됨", + "description" : "Ledger Live를 장치에 연결할 수 없습니다. 다시 시도해 주세요." }, "DisconnectedDeviceDuringOperation" : { - "title" : "죄송하지만 장치 연결이 해제된 것 같습니다", - "description" : "다시 연결하여 재시도해주세요." + "title" : "장치 연결 해제됨", + "description" : "Ledger Live를 장치에 연결할 수 없습니다. 다시 시도해 주세요." }, "EConnReset" : { "title" : "Ledger 애플리케이션 스토어에 연결할 수 없습니다.", @@ -5310,6 +5316,10 @@ "title" : "거부된 조치", "description" : "사용자가 장치에서 거래를 거부했습니다" }, + "ExpertModeRequired" : { + "title" : "전문가 모드 필요", + "description" : "전문가 모드를 활성화해야 합니다." + }, "TransactionRefusedOnDevice" : { "title" : "장치에서 거래 거부", "description" : "확실하지 않을 경우 재시도하거나 Ledger 지원 부서에 연락하세요" @@ -5599,7 +5609,7 @@ "title" : "이전 트랜잭션이 아직 처리되지 않았습니다. 잠시 기다려 트랜잭션 내역을 확인한 후 다시 시도하세요." }, "SolanaTxConfirmationTimeout" : { - "title" : "Your transaction may have failed. Please wait a moment then check the transaction history before trying again." + "title" : "트랜잭션이 실패한 것 같습니다. 잠시 기다려 트랜잭션 내역을 확인한 후 다시 시도하세요." }, "NotEnoughNftOwned" : { "title" : "사용 가능한 토큰 수를 초과했습니다" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "제거", "steps" : { "choose" : { - "stepLabel" : "이미지 선택", + "stepLabel" : "사진 선택", "description" : "(...)로 설정할 이미지 선택", "pickFromNftGallery" : "내 NFT 갤러리에서 선택", "myNfts" : "내 NFT", - "upload" : "내 컴퓨터에서 업로드", + "upload" : "컴퓨터에서 업로드", "chooseNft" : "NFT 선택하기", "remove" : "현재 사진 삭제", "selectNft" : "NFT 선택", - "previousSelectNft" : "뒤로", "nftEmptyStateTitle" : "아직 표시할 NFT가 없습니다", "nftEmptyStateDescription" : "지갑에 NFT를 추가하고 시작하세요." }, "adjust" : { - "stepLabel" : "이미지 조정", - "rotate" : "회전" + "stepLabel" : "잘라내기", + "rotate" : "회전", + "confirmCrop" : "크롭한 이미지를 확인하세요" }, "contrast" : { - "stepLabel" : "대비 선택" + "stepLabel" : "대비 설정", + "confirmContrast" : "대비를 확인하세요" }, "transfer" : { - "stepLabel" : "전송", - "uploadAnotherImage" : "다른 이미지 업로드", - "allowPreview" : "잠금 화면 사진이 {{productName}}에 로드되도록 허용하세요", + "stepLabel" : "로드", + "useAnotherPicture" : "다른 사진을 업로드하세요", + "allowPreview" : "잠금 화면을 사용자 정의하려면 \"사진 로드\"를 탭하세요.", "allowConfirmPreview" : "{{productName}}에서 잠금 화면 이미지 복원 허용", "loadingPicture" : "로딩 중...", + "voila" : "짜잔!", "imageLoaded" : "{{productName}}에서 로드한 이미지", "confirmPicture" : "마음에 드시나요?\n그러면 저장하세요!", "confirmRestorePicture" : "잠금 화면 이미지 복원 확인", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "내 장치 커스텀", - "description" : "화면 커스텀을 통해", + "title" : "잠금화면을 취향대로 꾸며보세요", + "description" : "Ledger Stax의 잠금화면으로 설정할 NFT나 사진을 선택하세요.", "actionCompletedPopupLabel" : "장치 커스텀 완료" }, - "customImageSet" : "잠금화면을 설정하세요", - "finishCTA" : "완료" + "customImageSet" : "잠금화면 꾸미기 완료", + "finishCTA" : "닫기" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "네트워크 오류", "subtitle" : "문제가 발생했습니다. 다시 시도해주세요. 문제가 지속될 경우, 로그를 저장하고 Ledger 지원 부서에 연락하세요.", - "tryAgain" : "다시 시도하세요", "contactSupport" : "Ledger 지원 부서에 문의해주세요", "saveLog" : "로그 저장" } diff --git a/apps/ledger-live-desktop/static/i18n/pt-BR/app.json b/apps/ledger-live-desktop/static/i18n/pt-BR/app.json index 6d8c26e39a23..8693584e7166 100644 --- a/apps/ledger-live-desktop/static/i18n/pt-BR/app.json +++ b/apps/ledger-live-desktop/static/i18n/pt-BR/app.json @@ -122,6 +122,7 @@ "search" : "Pesquisar...", "searchWithoutEllipsis" : "Pesquisar", "manage" : "Gerenciar", + "tryAgain" : "Tente novamente", "lockScreen" : { "title" : "Boas-vindas de volta", "subTitle" : null, @@ -406,12 +407,12 @@ "missingApp" : { "title" : "Instale o aplicativo {{appName}} no seu dispositivo", "subtitle" : "Vá à Minha Ledger e instale o aplicativo {{appName}} para trocar ativos.", - "cta" : "Vá à Minha Ledger" + "cta" : "Ir para Minha Ledger" }, "outdatedApp" : { "title" : "Atualize o aplicativo {{appName}} no seu dispositivo", "subtitle" : "Vá à Minha Ledger e atualize o aplicativo {{appName}} para trocar ativos.", - "cta" : "Vá à Minha Ledger" + "cta" : "Ir para Minha Ledger" }, "providers" : { "title" : "Escolha um provedor para trocar criptos", @@ -539,13 +540,17 @@ "swap" : { "title" : "Trocar", "label" : "Populares", - "body" : "Converta cripto para cripto em segurança" + "body" : "Troque cripto por cripto em segurança" }, "receive" : { "title" : "Receber", "body" : "Receba cripto na sua carteira" } } + }, + "getFundsModal" : { + "text" : "Obter {{coin}} para fazer staking", + "description" : "Compre, troque ou receba criptomoedas diretamente em sua Ledger pelo Ledger Live." } }, "lottieDebugger" : { @@ -1387,7 +1392,7 @@ }, "swap" : { "title" : "Trocar", - "description" : "Converta cripto para cripto em segurança", + "description" : "Troque cripto por cripto em segurança", "label" : "Populares" }, "earn" : { @@ -1410,7 +1415,7 @@ "title" : "Instalar aplicativos no seu dispositivo", "desc" : "Vá à Minha Ledger para instalar aplicativos no seu dispositivo. Você pode adicionar contas quando tiver aplicativos instalados.", "buttons" : { - "installApp" : "Vá à Minha Ledger", + "installApp" : "Ir para Minha Ledger", "help" : "Ajuda" } }, @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "Abra o aplicativo {{wording}} no seu dispositivo", "allowAppPermissionSubtitleToken" : "para gerenciar seus tokens {{token}}", - "allowManagerPermission" : "Permitir {{wording}} no seu dispositivo", + "allowManagerPermission" : "Permitir uma conexão segura no seu dispositivo", + "allowRenaming" : "Permitir renomeação do seu dispositivo", "loading" : "Carregando...", "connectAndUnlockDevice" : "Conecte e desbloqueie seu dispositivo", "unlockDevice" : "Desbloqueie seu dispositivo", @@ -1867,7 +1873,7 @@ "updateBtn" : "Atualizar Firmware", "banner" : { "warning" : "Atualização do firmware {{latestFirmware}} disponível", - "cta" : "Vá à Minha Ledger", + "cta" : "Ir para Minha Ledger", "old" : { "warning" : "A versão do firmware do dispositivo é antiga demais para ser atualizada. Contate o Suporte Ledger para substituir o dispositivo.", "cta" : "Falar com o suporte" @@ -3888,8 +3894,8 @@ }, "experimental" : { "disclaimer" : "Estes são recursos experimentais que fornecemos \"tal como se encontram\" para serem testados pela nossa comunidade de especialistas em tecnologia. Eles podem mudar, quebrar ou ser removidos a qualquer momento. Ao habilitá-los, você concorda em usá-los por sua conta e risco.", - "provider" : "A configuração experimental \"Provedor da Minha Ledger ({{forcedProvider}})\" pode mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas compatibilidade. Você pode desativá-la nas configurações.", - "providerDevMode" : "As configurações experimentais \"Provedor da Minha Ledger ({{forcedProvider}})\" e \"Modo desenvolvedor\" podem mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas compatibilidade. Você pode desativá-las nas configurações.", + "provider" : "A configuração experimental \"Provedor da Minha Ledger ({{forcedProvider}})\" pode mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas de compatibilidade. Você pode desativá-la nas configurações.", + "providerDevMode" : "As configurações experimentais \"Provedor da Minha Ledger ({{forcedProvider}})\" e \"Modo desenvolvedor\" podem mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas de compatibilidade. Você pode desativá-las nas configurações.", "devMode" : "A configuração experimental \"Modo desenvolvedor\" pode mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas de compatibilidade. Você pode desativá-la nas configurações.", "providerCTA" : "Ir para Configurações", "features" : { @@ -4061,7 +4067,7 @@ "downloadProgress" : "{{progress}}% concluído", "checking" : "Verificando Atualização...", "checkSuccess" : "Nova atualização do Ledger Live disponível, ela será instalada automaticamente quando você fechar o aplicativo", - "quitAndInstall" : "Instalar agora", + "quitAndInstall" : "Instalar e reiniciar agora", "updateAvailable" : "Atualização para a versão {{version}} do Ledger Live disponível", "error" : "Erro durante a atualização. Baixe Novamente", "reDownload" : "Baixar Novamente", @@ -5077,12 +5083,12 @@ "description" : "Tente Novamente." }, "DisconnectedDevice" : { - "title" : "Parece que seu dispositivo está desconectado", - "description" : "Reconecte-o e tente novamente." + "title" : "Dispositivo desconectado", + "description" : "O Ledger Live não conseguiu se conectar ao seu dispositivo. Tente Novamente." }, "DisconnectedDeviceDuringOperation" : { - "title" : "Parece que seu dispositivo está desconectado", - "description" : "Reconecte-o e tente novamente." + "title" : "Dispositivo desconectado", + "description" : "O Ledger Live não conseguiu se conectar ao seu dispositivo. Tente Novamente." }, "EConnReset" : { "title" : "A loja de aplicativos da Ledger não pode ser acessada", @@ -5310,6 +5316,10 @@ "title" : "Ação Rejeitada", "description" : "O usuário rejeitou a operação no dispositivo" }, + "ExpertModeRequired" : { + "title" : "Requer modo Expert", + "description" : "É necessário ativar o modo Expert." + }, "TransactionRefusedOnDevice" : { "title" : "Operação negada no dispositivo", "description" : "Tente novamente ou contate o Suporte Ledger em caso de dúvidas" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "Remover", "steps" : { "choose" : { - "stepLabel" : "Escolha uma imagem", + "stepLabel" : "Escolher foto", "description" : "Escolha uma imagem para definir como (...)", "pickFromNftGallery" : "Selecionar na minha galeria de NFTs", "myNfts" : "Meus NFTs", - "upload" : "Carregar do meu computador", + "upload" : "Enviar do computador", "chooseNft" : "Escolha um NFT", "remove" : "Remover a imagem atual", "selectNft" : "Escolher NFT", - "previousSelectNft" : "voltar", "nftEmptyStateTitle" : "Sem NFTs para mostrar ainda", "nftEmptyStateDescription" : "Comece adicionando NFTs à sua carteira." }, "adjust" : { - "stepLabel" : "Ajustar imagem", - "rotate" : "Girar" + "stepLabel" : "Cortar", + "rotate" : "Girar", + "confirmCrop" : "Confirmar corte" }, "contrast" : { - "stepLabel" : "Escolher contraste" + "stepLabel" : "Definir contraste", + "confirmContrast" : "Confirmar contraste" }, "transfer" : { - "stepLabel" : "Transferência", - "uploadAnotherImage" : "Enviar outra imagem", - "allowPreview" : "Permitir que a imagem da tela de bloqueio seja carregada em sua {{productName}}", + "stepLabel" : "Carregar", + "useAnotherPicture" : "Enviar outra foto", + "allowPreview" : "Toque em “Carregar imagem” para personalizar a tela de bloqueio", "allowConfirmPreview" : "Permitir restauração da imagem da tela de bloqueio em {{productName}}", "loadingPicture" : "Carregando...", + "voila" : "Voilà!", "imageLoaded" : "Imagem carregada em {{productName}}", "confirmPicture" : "Gostou do que está vendo?\nMantenha assim!", "confirmRestorePicture" : "Confirme a restauração da imagem da tela de bloqueio", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Personalizar meu dispositivo", - "description" : "Customizando a tela", + "title" : "Personalizar a tela de bloqueio", + "description" : "Escolha qualquer NFT ou foto como a tela de bloqueio de sua Ledger Stax.", "actionCompletedPopupLabel" : "Dispositivo personalizado" }, - "customImageSet" : "Tela de bloqueio definida", - "finishCTA" : "Finalizar" + "customImageSet" : "Tela de bloqueio personalizada", + "finishCTA" : "Fechar" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "Erro de rede", "subtitle" : "Algo deu errado. Tente novamente. Se o problema persistir, salve seu registro e entre em contato com o Suporte Ledger.", - "tryAgain" : "Tente novamente", "contactSupport" : "Fale com o Suporte Ledger", "saveLog" : "Salvar registro" } diff --git a/apps/ledger-live-desktop/static/i18n/ru/app.json b/apps/ledger-live-desktop/static/i18n/ru/app.json index fcab3153333a..d8f3dedcc59a 100644 --- a/apps/ledger-live-desktop/static/i18n/ru/app.json +++ b/apps/ledger-live-desktop/static/i18n/ru/app.json @@ -122,6 +122,7 @@ "search" : "Поиск...", "searchWithoutEllipsis" : "Поиск", "manage" : "Управление", + "tryAgain" : "Попробовать ещё раз", "lockScreen" : { "title" : "С возвращением", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "Получайте криптоактивы прямо на счёт" } } + }, + "getFundsModal" : { + "text" : "Получить {{coin}} для стейкинга", + "description" : "Покупайте, обменивайте или получайте крипту сразу на Ledger через Ledger Live." } }, "lottieDebugger" : { @@ -1509,7 +1514,7 @@ "viewer" : { "actions" : { "send" : "Отправить", - "open" : "Open in {{viewer}}" + "open" : "Открыть в {{viewer}}" }, "attributes" : { "properties" : "Свойства", @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "Откройте приложение {{wording}} на устройстве", "allowAppPermissionSubtitleToken" : "для управления {{token}}", - "allowManagerPermission" : "Одобрите использование «Мой Ledger» на устройстве", + "allowManagerPermission" : "Одобрите работу приложения на устройстве", + "allowRenaming" : "Одобрите переименование на устройстве", "loading" : "Загружаем...", "connectAndUnlockDevice" : "Подключите и разблокируйте устройство", "unlockDevice" : "Разблокируйте устройство", @@ -4049,11 +4055,11 @@ "setPassword" : { "title" : "Блокировка паролем", "subTitle" : "Установить пароль", - "desc" : "Храните свой пароль в безопасности. В случае его потери нужно будет сбросить Ledger Live и заново подключить счета." + "desc" : "Храните свой пароль в безопасности. В случае его потери нужно будет сбросить Ledger Live и заново добавить счета." }, "disablePassword" : { "title" : "Отключить блокировку паролем", - "desc" : "Данные Ledger Live будут храниться на ПК в незашифрованном виде. К таким данным относятся названия счетов, информация о транзакциях и публичные адреса кошельков." + "desc" : "Данные Ledger Live будут храниться в незашифрованном виде. К таким данным относятся названия счетов, информация о транзакциях и публичные адреса кошельков." } }, "update" : { @@ -4061,7 +4067,7 @@ "downloadProgress" : "Уже {{progress}}%", "checking" : "Проверяем обновления...", "checkSuccess" : "Доступно обновление Ledger Live. Оно установится автоматически после закрытия приложения", - "quitAndInstall" : "Установить", + "quitAndInstall" : "Обновить и перезапустить", "updateAvailable" : "Доступно обновление Ledger Live {{version}}", "error" : "Во время обновления произошла ошибка. Попробуйте ещё раз", "reDownload" : "Скачать ещё раз", @@ -5077,12 +5083,12 @@ "description" : "Пожалуйста, попробуйте ещё раз." }, "DisconnectedDevice" : { - "title" : "Извините, похоже, ваше устройство отключено", - "description" : "Пожалуйста, переподключите его и повторите попытку." + "title" : "Устройство отключено", + "description" : "Ledger Live не удалось подключиться к устройству. Пожалуйста, попробуйте ещё раз." }, "DisconnectedDeviceDuringOperation" : { - "title" : "Извините, похоже, ваше устройство отключено", - "description" : "Пожалуйста, переподключите его и повторите попытку." + "title" : "Устройство отключено", + "description" : "Ledger Live не удалось подключиться к устройству. Пожалуйста, попробуйте ещё раз." }, "EConnReset" : { "title" : "Мой Ledger недоступен", @@ -5310,6 +5316,10 @@ "title" : "Действие отклонено", "description" : "Пользователь отклонил операцию на устройстве" }, + "ExpertModeRequired" : { + "title" : "Требуется Режим эксперта", + "description" : "Нужно активировать «Режим эксперта»." + }, "TransactionRefusedOnDevice" : { "title" : "Операция отклонена на устройстве", "description" : "Повторите попытку или обратитесь в Поддержку в случае сомнений" @@ -5795,7 +5805,7 @@ "managerCTARemove" : "Удалить", "steps" : { "choose" : { - "stepLabel" : "Выбрать изображение", + "stepLabel" : "Выбор изображения", "description" : "Выберите изображение для использования в качестве (...)", "pickFromNftGallery" : "Выбрать из галереи NFT", "myNfts" : "Мои NFT", @@ -5803,23 +5813,25 @@ "chooseNft" : "Выбрать NFT", "remove" : "Удалить изображение", "selectNft" : "Выбрать NFT", - "previousSelectNft" : "Назад", "nftEmptyStateTitle" : "Пока тут ничего нет", "nftEmptyStateDescription" : "Сначала добавьте NFT в кошелёк" }, "adjust" : { - "stepLabel" : "Изменить изображение", - "rotate" : "Повернуть" + "stepLabel" : "Обрезка", + "rotate" : "Повернуть", + "confirmCrop" : "Подтвердить обрезку" }, "contrast" : { - "stepLabel" : "Указать контраст" + "stepLabel" : "Контраст", + "confirmContrast" : "Подтвердить контраст" }, "transfer" : { - "stepLabel" : "Перевод", - "uploadAnotherImage" : "Загрузить другое изображение", - "allowPreview" : "Дождитесь загрузки экрана блокировки на {{productName}}", + "stepLabel" : "Загрузка", + "useAnotherPicture" : "Загрузить другое изображение", + "allowPreview" : "Нажмите «Загрузить картинку» для настройки экрана блокировки", "allowConfirmPreview" : "Разрешите восстановление изображения экрана блокировки на {{productName}}", "loadingPicture" : "Загружаем...", + "voila" : "Вот и всё!", "imageLoaded" : "Изображение загружено в {{productName}}", "confirmPicture" : "Ну как, нравится?\nТогда так и оставьте!", "confirmRestorePicture" : "Подтвердите восстановление изображения экрана блокировки", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Персонализируйте устройство", - "description" : "Благодаря гибким настройкам экрана", + "title" : "Настройки экрана блокировки", + "description" : "Выберите любой NFT или изображение и используйте его как экран блокировки Ledger Stax.", "actionCompletedPopupLabel" : "Устройство персонализировано" }, - "customImageSet" : "Изображение установлено", - "finishCTA" : "Завершить" + "customImageSet" : "Экран блокировки настроен", + "finishCTA" : "Закрыть" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "Ошибка сети", "subtitle" : "Что-то пошло не так. Пожалуйста, попробуйте ещё раз. Если проблема повторяется, сохраните логи и свяжитесь с Поддержкой Ledger.", - "tryAgain" : "Попробовать ещё раз", "contactSupport" : "Связаться с Поддержкой", "saveLog" : "Сохранить логи" } diff --git a/apps/ledger-live-desktop/static/i18n/tr/app.json b/apps/ledger-live-desktop/static/i18n/tr/app.json index 2e2250365c39..2c7af80f0f9f 100644 --- a/apps/ledger-live-desktop/static/i18n/tr/app.json +++ b/apps/ledger-live-desktop/static/i18n/tr/app.json @@ -122,6 +122,7 @@ "search" : "Ara...", "searchWithoutEllipsis" : "Ara", "manage" : "Yönet", + "tryAgain" : "Tekrar dene", "lockScreen" : { "title" : "Tekrar hoş geldiniz", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "Cüzdanınıza kripto transferi alın" } } + }, + "getFundsModal" : { + "text" : "Stake etmek için {{coin}} edinin", + "description" : "Ledger Live'ı kullanarak doğrudan Ledger'ınızda kripto satın alın, takas edin veya alın." } }, "lottieDebugger" : { @@ -1401,7 +1406,7 @@ "for" : "<1><0>{{name}} için adres", "messageIfUnverified" : "Lütfen paylaşılan adres ile cihazınızdaki adresin tam olarak eşleştiğini doğrulayın", "messageIfSkipped" : "{{name}} adresiniz Ledger cihazınızda doğrulanmadı. Güvenlik için lütfen doğrulayın.", - "showQrCode" : "QR Kodunu Göster", + "showQrCode" : "Karekodu Göster", "taprootWarning" : "Gönderenin Taproot'u desteklediğinden emin olun", "dashStakingWarning" : "Lütfen bu adresi staking ödüllerini almak için kullanmayın" }, @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "Cihazınızda {{wording}} uygulamasını açın", "allowAppPermissionSubtitleToken" : "ve {{token}} token'larınızı yönetin", - "allowManagerPermission" : "Cihazınızda {{wording}} uygulamasına izin verin", + "allowManagerPermission" : "Cihazınızda Ledger Yöneticisine izin verin", + "allowRenaming" : "Cihazınızda yeniden adlandırmaya izin verin", "loading" : "Yükleniyor...", "connectAndUnlockDevice" : "Cihazınızı bağlayın ve kilidini açın", "unlockDevice" : "Cihazınızın kilidini açın", @@ -3857,7 +3863,7 @@ "profile" : { "password" : "Parola kilidi", "passwordDesc" : "Hesap adları, bakiyeler, işlemler ve açık adresler gibi bilgisayarınızda bulunan Ledger Live verilerinin güvenliğini sağlamak için bir parola belirleyin.", - "passwordAutoLock" : "Otomatik kilitleme", + "passwordAutoLock" : "Otomatik kilit", "passwordAutoLockDesc" : "Ledger Live etkin olmadığında onu otomatik olarak kilitleyin.", "changePassword" : "Parola değiştir", "softResetTitle" : "Önbelleği temizleyin", @@ -4061,7 +4067,7 @@ "downloadProgress" : "%{{progress}} tamamlandı", "checking" : "Güncelleme kontrol ediliyor...", "checkSuccess" : "Yeni Ledger Live güncellemesi mevcut. Güncelleme, uygulamayı kapattığınızda otomatik olarak yüklenecek.", - "quitAndInstall" : "Şimdi yükle", + "quitAndInstall" : "Hemen yükle ve yeniden başlat", "updateAvailable" : "Ledger Live {{version}} sürüm güncellemesi mevcut", "error" : "Güncelleme sırasında bir hata oluştu. Lütfen tekrar indirin", "reDownload" : "Tekrar indir", @@ -5077,12 +5083,12 @@ "description" : "Lütfen tekrar deneyin." }, "DisconnectedDevice" : { - "title" : "Üzgünüz, cihazınızın bağlantısı kesilmiş görünüyor", - "description" : "Lütfen yeniden bağlanın ve tekrar deneyin." + "title" : "Cihaz bağlantısı kesildi", + "description" : "Ledger Live, cihazınıza bağlanamadı. Lütfen tekrar deneyin." }, "DisconnectedDeviceDuringOperation" : { - "title" : "Üzgünüz, cihazınızın bağlantısı kesilmiş görünüyor", - "description" : "Lütfen yeniden bağlanın ve tekrar deneyin." + "title" : "Cihaz bağlantısı kesildi", + "description" : "Ledger Live, cihazınıza bağlanamadı. Lütfen tekrar deneyin." }, "EConnReset" : { "title" : "Ledger uygulama mağazasına ulaşılamıyor", @@ -5310,6 +5316,10 @@ "title" : "Eylem reddedildi", "description" : "Kullanıcı cihazdaki işlemi reddetti" }, + "ExpertModeRequired" : { + "title" : "Uzman modu gerekli", + "description" : "Uzman modunun etkinleştirilmesi gerekiyor." + }, "TransactionRefusedOnDevice" : { "title" : "İşlem cihazda reddedildi", "description" : "Lütfen tekrar deneyin veya bir şüpheniz varsa Ledger Destek ile iletişime geçin" @@ -5374,7 +5384,7 @@ "description" : "Bu işlem zaten doğrulanmış" }, "CantScanQRCode" : { - "title" : "Bu QR kodu taranamadı; otomatik doğrulama bu adres tarafından desteklenmiyor" + "title" : "Bu karekod okunamadı; otomatik doğrulama bu adres tarafından desteklenmiyor" }, "FeeNotLoaded" : { "title" : "Ücret oranları yüklenemedi. Lütfen manuel ücretler belirleyin" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "Kaldır", "steps" : { "choose" : { - "stepLabel" : "Bir görüntü seçin", + "stepLabel" : "Resim seçin", "description" : "Bir görüntü seçip ayarlayın (...)", "pickFromNftGallery" : "NFT galerimden seç", "myNfts" : "NFT'lerim", - "upload" : "Bilgisayarımdan yükle", + "upload" : "Bilgisayardan yükle", "chooseNft" : "Bir NFT seçin", "remove" : "Mevcut resmi kaldır", "selectNft" : "NFT'yi seç", - "previousSelectNft" : "Geri", "nftEmptyStateTitle" : "Gösterilecek NFT yok", "nftEmptyStateDescription" : "Öncelikle cüzdanınıza NFT ekleyin." }, "adjust" : { - "stepLabel" : "Görüntüyü ayarla", - "rotate" : "Döndür" + "stepLabel" : "Kırpın", + "rotate" : "Döndür", + "confirmCrop" : "Kırpmayı onayla" }, "contrast" : { - "stepLabel" : "Kontrastı seç" + "stepLabel" : "Kontrastı ayarlayın", + "confirmContrast" : "Kontrastı onayla" }, "transfer" : { - "stepLabel" : "Transfer", - "uploadAnotherImage" : "Başka bir görsel yükleyin", - "allowPreview" : "{{productName}} cihazınızda kilitli ekran resminin yüklenmesine izin verin", + "stepLabel" : "Yükleyin", + "useAnotherPicture" : "Başka bir resim yükleyin", + "allowPreview" : "Kilit ekranını özelleştirmek için “Resmi yükle” seçeneğine dokunun", "allowConfirmPreview" : "{{productName}} cihazında kilitli ekran resminin geri yüklenmesine izin verin", "loadingPicture" : "Yükleniyor...", + "voila" : "İşte bu kadar!", "imageLoaded" : "Görsel {{productName}} cihazına yüklendi", "confirmPicture" : "Gördüğünüz şey hoşunuza gitti mi?\nO zaman böyle kalsın!", "confirmRestorePicture" : "Kilitli ekran resminin geri yüklenmesini onaylayın", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "Cihazınızı kişiselleştirin", - "description" : "Ekranı özelleştirin", + "title" : "Kilit ekranını kişiselleştirin", + "description" : "Ledger Stax cihazınızın kilit ekranında gösterilmesini istediğiniz NFT'yi ya da resmi seçin.", "actionCompletedPopupLabel" : "Cihaz kişiselleştirildi" }, - "customImageSet" : "Kilitli ekran belirlendi", - "finishCTA" : "Bitir" + "customImageSet" : "Kilit ekranı kişiselleştirildi", + "finishCTA" : "Kapat" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "Ağ Hatası", "subtitle" : "Bir hata oluştu. Lütfen tekrar deneyin. Sorun devam ederse log'unuzu kaydedin ve Ledger destek ekibiyle iletişime geçin.", - "tryAgain" : "Tekrar dene", "contactSupport" : "Ledger Destek ile iletişime geçin", "saveLog" : "Log'u kaydet" } diff --git a/apps/ledger-live-desktop/static/i18n/zh/app.json b/apps/ledger-live-desktop/static/i18n/zh/app.json index c801311c207f..a6877c92167f 100644 --- a/apps/ledger-live-desktop/static/i18n/zh/app.json +++ b/apps/ledger-live-desktop/static/i18n/zh/app.json @@ -122,6 +122,7 @@ "search" : "搜索...", "searchWithoutEllipsis" : "搜索", "manage" : "管理", + "tryAgain" : "请重试", "lockScreen" : { "title" : "欢迎回来", "subTitle" : null, @@ -546,6 +547,10 @@ "body" : "在您的钱包中接收加密货币" } } + }, + "getFundsModal" : { + "text" : "获取 {{coin}} 进行权益质押", + "description" : "使用 Ledger Live 直接在您的 Ledger 设备上买入、互换或接收加密货币。" } }, "lottieDebugger" : { @@ -1700,7 +1705,8 @@ "DeviceAction" : { "allowAppPermission" : "在您的设备上打开 {{wording}} 应用程序", "allowAppPermissionSubtitleToken" : "管理您的 {{token}} 代币", - "allowManagerPermission" : "允许 {{wording}} 在您的设备上运行", + "allowManagerPermission" : "允许 Ledger 管理器在您的设备上运行", + "allowRenaming" : "允许在您的设备上重命名", "loading" : "正在加载……", "connectAndUnlockDevice" : "连接并解锁您的设备", "unlockDevice" : "解锁您的设备", @@ -4061,7 +4067,7 @@ "downloadProgress" : "已完成 {{progress}}%", "checking" : "正在检查更新...", "checkSuccess" : "Ledger Live 有新的更新,当您关闭应用程序时会自动安装更新。", - "quitAndInstall" : "立即安装", + "quitAndInstall" : "立即安装并重新启动", "updateAvailable" : "Ledger Live 有新版本 {{version}} 可更新", "error" : "更新时出错。请重新下载", "reDownload" : "重新下载", @@ -5077,12 +5083,12 @@ "description" : "请再次尝试。" }, "DisconnectedDevice" : { - "title" : "抱歉,您的设备似乎已断开连接", - "description" : "请重新连接并重试。" + "title" : "设备已断开", + "description" : "Ledger Live 无法连接到您的设备。请再次尝试。" }, "DisconnectedDeviceDuringOperation" : { - "title" : "抱歉,您的设备似乎已断开连接", - "description" : "请重新连接并重试。" + "title" : "设备已断开", + "description" : "Ledger Live 无法连接到您的设备。请再次尝试。" }, "EConnReset" : { "title" : "无法访问 Ledger 应用程序商店", @@ -5310,6 +5316,10 @@ "title" : "操作被拒绝", "description" : "用户在设备上拒绝了该操作" }, + "ExpertModeRequired" : { + "title" : "需要专家模式", + "description" : "需要启用专家模式。" + }, "TransactionRefusedOnDevice" : { "title" : "操作在设备上被拒绝", "description" : "请重试,如有疑问,请联系 Ledger 客服。" @@ -5596,7 +5606,7 @@ "title" : "确保您有足够的剩余余额以用作未来的交易费" }, "SolanaTxSimulationFailedWhilePendingOp" : { - "title" : "Your previous transaction hasn't been processed yet. Please wait a moment then check the transaction history before trying again." + "title" : "您之前的交易尚未处理。请稍等片刻后检查交易记录,然后重试。" }, "SolanaTxConfirmationTimeout" : { "title" : "您的交易可能失败了。请稍等片刻后检查交易记录,然后重试。" @@ -5795,31 +5805,33 @@ "managerCTARemove" : "删除", "steps" : { "choose" : { - "stepLabel" : "选择一张图片", + "stepLabel" : "选择图片", "description" : "选择要设为 (...) 的图片", "pickFromNftGallery" : "从我的 NFT 画廊中选择", "myNfts" : "我的 NFT", - "upload" : "从我的计算机上传", + "upload" : "从计算机上传", "chooseNft" : "选择 NFT", "remove" : "移除当前图片", "selectNft" : "选择 NFT", - "previousSelectNft" : "返回", "nftEmptyStateTitle" : "暂时没有 NFT 可显示", "nftEmptyStateDescription" : "首先将 NFT 添加到您的钱包" }, "adjust" : { - "stepLabel" : "调整图片", - "rotate" : "旋转" + "stepLabel" : "裁剪", + "rotate" : "旋转", + "confirmCrop" : "确认剪裁" }, "contrast" : { - "stepLabel" : "选择对比度" + "stepLabel" : "设置对比度", + "confirmContrast" : "确认对比" }, "transfer" : { - "stepLabel" : "转移", - "uploadAnotherImage" : "上传另一张图片", - "allowPreview" : "允许在您的 {{productName}} 上加载锁屏图片", + "stepLabel" : "加载", + "useAnotherPicture" : "上传另一张图片", + "allowPreview" : "点按“Load picture”(加载图片)自定义锁屏界面", "allowConfirmPreview" : "允许在 {{productName}} 上恢复锁屏图片", "loadingPicture" : "正在加载……", + "voila" : "好啦!", "imageLoaded" : "图片已加载到 {{productName}}", "confirmPicture" : "很合心意?\n用此设定!", "confirmRestorePicture" : "确认恢复锁屏图片", @@ -5827,12 +5839,12 @@ } }, "postOnboarding" : { - "title" : "个性化我的设备", - "description" : "通过自定义屏幕", + "title" : "自定义锁屏界面", + "description" : "选择任意 NFT 或图片,将其设置为 Ledger Stax 的锁屏界面。", "actionCompletedPopupLabel" : "设备已个性化" }, - "customImageSet" : "锁屏已设置", - "finishCTA" : "完成" + "customImageSet" : "已自定义锁屏界面", + "finishCTA" : "关闭" }, "onboardingAppInstall" : { "restore" : { @@ -5878,7 +5890,6 @@ "networkError" : { "title" : "网络错误", "subtitle" : "出错了。请再次尝试。如果仍有问题,请保存日志并联系 Ledger 客服。", - "tryAgain" : "请重试", "contactSupport" : "联系 Ledger 客服", "saveLog" : "保存日志" } diff --git a/apps/ledger-live-desktop/tests/models/SwapPage.ts b/apps/ledger-live-desktop/tests/models/SwapPage.ts index 6462e23fc284..3f4550d9a67f 100644 --- a/apps/ledger-live-desktop/tests/models/SwapPage.ts +++ b/apps/ledger-live-desktop/tests/models/SwapPage.ts @@ -124,8 +124,8 @@ export class SwapPage { } async reverseSwapPair() { - await this.page.waitForTimeout(500); // TODO: Needs to be fixed once we have accessible element await this.reverseSwapPairButton.click(); + await this.page.waitForTimeout(500); // TODO: Needs to be fixed once we have accessible element } async addDestinationAccount() { diff --git a/apps/ledger-live-desktop/tests/specs/services/swap.spec.ts b/apps/ledger-live-desktop/tests/specs/services/swap.spec.ts index 458549e01619..dc566fb3dccd 100644 --- a/apps/ledger-live-desktop/tests/specs/services/swap.spec.ts +++ b/apps/ledger-live-desktop/tests/specs/services/swap.spec.ts @@ -45,6 +45,24 @@ test.describe.parallel("Swap", () => { route.fulfill({ headers: { teststatus: "mocked" }, body: mockRatesResponse }); }); + await page.route("https://swap.ledger.com/v5/currencies/to**", async route => { + route.fulfill({ + headers: { teststatus: "mocked" }, + body: JSON.stringify({ + currencyGroups: [ + { + network: "dogecoin", + supportedCurrencies: ["dogecoin"], + }, + { + network: "ethereum", + supportedCurrencies: ["ethereum", "ethereum/erc20/usd_tether__erc20_"], + }, + ], + }), + }); + }); + await test.step("Navigate to swap via account page", async () => { await layout.goToAccounts(); await accountsPage.navigateToAccountByName(ethereumAccountName); diff --git a/apps/ledger-live-mobile/CHANGELOG.md b/apps/ledger-live-mobile/CHANGELOG.md index 7f7af7f62263..ba2a83b35e48 100644 --- a/apps/ledger-live-mobile/CHANGELOG.md +++ b/apps/ledger-live-mobile/CHANGELOG.md @@ -1,5 +1,66 @@ # live-mobile +## 3.33.1 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + +- [#4915](https://github.com/LedgerHQ/ledger-live/pull/4915) [`ef6bc3319c`](https://github.com/LedgerHQ/ledger-live/commit/ef6bc3319ca90dd06c0a1f089e732416d1e6b3dc) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - Need to allow restore on onboarding state without device selected yet + +- [#4924](https://github.com/LedgerHQ/ledger-live/pull/4924) [`ae2c209be4`](https://github.com/LedgerHQ/ledger-live/commit/ae2c209be4c82ded56faf8a2539fcf27cf07fbb4) Thanks [@cgrellard-ledger](https://github.com/cgrellard-ledger)! - LLM - small modif on the name of a param from the protectServicesMobile feature flag. Also the recover button is now displayed before the wallet connect button in the quick actions + +- [#4882](https://github.com/LedgerHQ/ledger-live/pull/4882) [`b5f6faf0df`](https://github.com/LedgerHQ/ledger-live/commit/b5f6faf0df5e484dc56b422883e16e04d181903f) Thanks [@mcayuelas-ledger](https://github.com/mcayuelas-ledger)! - Add New Entry in TransferDrawer for Recover + +- [#4862](https://github.com/LedgerHQ/ledger-live/pull/4862) [`112fc4deb0`](https://github.com/LedgerHQ/ledger-live/commit/112fc4deb0b391ccde19f655efd76bf7de063c99) Thanks [@mcayuelas-ledger](https://github.com/mcayuelas-ledger)! - Update UI in Manager for Services Recover + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1 + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/coin-evm@0.9.0 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/domain-service@1.1.13 + +## 3.33.1-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1-hotfix.2 + - @ledgerhq/coin-evm@0.9.0-hotfix.2 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + - @ledgerhq/domain-service@1.1.13-hotfix.1 + +## 3.33.1-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-evm@0.9.0-hotfix.1 + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + - @ledgerhq/live-common@33.0.1-hotfix.1 + +## 3.33.1-hotfix.0 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + +- [#4915](https://github.com/LedgerHQ/ledger-live/pull/4915) [`ef6bc3319c`](https://github.com/LedgerHQ/ledger-live/commit/ef6bc3319ca90dd06c0a1f089e732416d1e6b3dc) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - Need to allow restore on onboarding state without device selected yet + +- [#4924](https://github.com/LedgerHQ/ledger-live/pull/4924) [`ae2c209be4`](https://github.com/LedgerHQ/ledger-live/commit/ae2c209be4c82ded56faf8a2539fcf27cf07fbb4) Thanks [@cgrellard-ledger](https://github.com/cgrellard-ledger)! - LLM - small modif on the name of a param from the protectServicesMobile feature flag. Also the recover button is now displayed before the wallet connect button in the quick actions + +- [#4882](https://github.com/LedgerHQ/ledger-live/pull/4882) [`b5f6faf0df`](https://github.com/LedgerHQ/ledger-live/commit/b5f6faf0df5e484dc56b422883e16e04d181903f) Thanks [@mcayuelas-ledger](https://github.com/mcayuelas-ledger)! - Add New Entry in TransferDrawer for Recover + +- [#4862](https://github.com/LedgerHQ/ledger-live/pull/4862) [`112fc4deb0`](https://github.com/LedgerHQ/ledger-live/commit/112fc4deb0b391ccde19f655efd76bf7de063c99) Thanks [@mcayuelas-ledger](https://github.com/mcayuelas-ledger)! - Update UI in Manager for Services Recover + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/live-common@33.0.1-hotfix.0 + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/coin-evm@0.8.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.0 + ## 3.33.0 ### Minor Changes diff --git a/apps/ledger-live-mobile/package.json b/apps/ledger-live-mobile/package.json index a68adbb9cd09..2a1087b65193 100644 --- a/apps/ledger-live-mobile/package.json +++ b/apps/ledger-live-mobile/package.json @@ -1,6 +1,6 @@ { "name": "live-mobile", - "version": "3.33.0", + "version": "3.33.1", "private": true, "scripts": { "postinstall": "zx ./scripts/post.mjs", diff --git a/apps/ledger-live-mobile/src/components/ServicesWidget/Protect/useProtect.ts b/apps/ledger-live-mobile/src/components/ServicesWidget/Protect/useProtect.ts index a46cc1f9e7c1..b75bbfa24fba 100644 --- a/apps/ledger-live-mobile/src/components/ServicesWidget/Protect/useProtect.ts +++ b/apps/ledger-live-mobile/src/components/ServicesWidget/Protect/useProtect.ts @@ -1,26 +1,22 @@ import { useFeature } from "@ledgerhq/live-common/featureFlags/index"; -import { - useLearnMoreURI, - useAlreadySubscribedURI, -} from "@ledgerhq/live-common/hooks/recoverFeatureFlag"; +import { useLoginURI, useLearnMoreURI } from "@ledgerhq/live-common/hooks/recoverFeatureFlag"; import { useMemo } from "react"; import { Linking } from "react-native"; import { track } from "../../../analytics"; -import { urls } from "@utils/urls"; export function useProtect() { const servicesConfig = useFeature("protectServicesMobile"); + const loginURI = useLoginURI(servicesConfig); const learnMoreURI = useLearnMoreURI(servicesConfig); - const alreadySubscribedURI = useAlreadySubscribedURI(servicesConfig); const onLearnMore = () => { - const url = `${learnMoreURI}&source=${urls.recoverSources.myLedger}`; + const url = `${learnMoreURI}`; Linking.canOpenURL(url).then(() => Linking.openURL(url)); }; - const onAlreadySubscribe = () => { - const url = `${alreadySubscribedURI}&source=${urls.recoverSources.myLedger}`; + const onLogin = () => { + const url = `${loginURI}`; Linking.canOpenURL(url).then(() => Linking.openURL(url)); }; @@ -30,7 +26,7 @@ export function useProtect() { }; const onClickSignIn = () => { - onAlreadySubscribe(); + onLogin(); trackEvent("button_clicked", "Sign In Recover"); }; const onClickFreeTrial = () => { @@ -46,8 +42,8 @@ export function useProtect() { }; const displayService = useMemo( - () => servicesConfig?.enabled && learnMoreURI && alreadySubscribedURI, - [alreadySubscribedURI, learnMoreURI, servicesConfig?.enabled], + () => servicesConfig?.enabled && learnMoreURI && loginURI, + [loginURI, learnMoreURI, servicesConfig?.enabled], ); return { diff --git a/apps/ledger-live-mobile/src/components/TabBar/Transfer.tsx b/apps/ledger-live-mobile/src/components/TabBar/Transfer.tsx index 43cf6e42f3cc..a3e1a4ec1a7e 100644 --- a/apps/ledger-live-mobile/src/components/TabBar/Transfer.tsx +++ b/apps/ledger-live-mobile/src/components/TabBar/Transfer.tsx @@ -201,7 +201,7 @@ export function TransferTabIcon() { style={[ { width: screenWidth, - maxHeight: screenHeight * 0.9 - bottomInset - topInset, + maxHeight: screenHeight - bottomInset - topInset, paddingBottom: bottomInset + 16 + MAIN_BUTTON_SIZE + MAIN_BUTTON_BOTTOM, }, opacityStyle, diff --git a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx index 808355f23ba5..4a00c7e0f5d5 100644 --- a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx +++ b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx @@ -199,6 +199,25 @@ export default function TransferDrawer({ onClose }: Omit onNavigateRecover(), + disabled: RECOVER.disabled, + testID: "transfer-recover-button", + }, + ] + : []), + ...(WALLET_CONNECT ? [ { diff --git a/apps/ledger-live-mobile/src/locales/ar/common.json b/apps/ledger-live-mobile/src/locales/ar/common.json index d27b50952038..f639643e0fd9 100644 --- a/apps/ledger-live-mobile/src/locales/ar/common.json +++ b/apps/ledger-live-mobile/src/locales/ar/common.json @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "قم بتوصيل محفظتك بالتطبيقات اللامركزية" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "جعل استعادة المحفظة أسهل", + "tag" : "شهر واحد مجاناً" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "الخدمات", "subTitle" : "إدارة خدمات Ledger لديك", + "signIn" : "تسجيل الدخول", + "recover" : { + "cta" : "ابدأ التجربة المجانية", + "desc" : "لا تقلق بشأن فقد الوصول إلى محفظتك الخاصة.", + "tag" : "1 شهر مجاناً" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/de/common.json b/apps/ledger-live-mobile/src/locales/de/common.json index aa1b6dae629f..b1a1aa8bbfe5 100644 --- a/apps/ledger-live-mobile/src/locales/de/common.json +++ b/apps/ledger-live-mobile/src/locales/de/common.json @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "Verbinden Sie Ihre Wallet mit dApps" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "Wallet-Wiederherstellung leicht gemacht", + "tag" : "1 Monat gratis" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "Services", "subTitle" : "Ihre Ledger-Dienste verwalten", + "signIn" : "Anmelden", + "recover" : { + "cta" : "Starten Sie Ihre kostenlose Testphase", + "desc" : "Machen Sie sich nie wieder Sorgen, den Zugang zu Ihrer Wallet zu verlieren.", + "tag" : "1 Monat gratis" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/es/common.json b/apps/ledger-live-mobile/src/locales/es/common.json index 1318b9870a3a..248ff1f3c727 100644 --- a/apps/ledger-live-mobile/src/locales/es/common.json +++ b/apps/ledger-live-mobile/src/locales/es/common.json @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "Conecta tu billetera a dApps" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "Fácil recuperación de billeteras", + "tag" : "Un mes gratis" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "Servicios", "subTitle" : "Gestiona tus servicios de Ledger", + "signIn" : "Iniciar sesión", + "recover" : { + "cta" : "Comienza tu prueba gratuita", + "desc" : "Deja de preocuparte de perder el acceso a tu billetera.", + "tag" : "1 mes gratis" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/fr/common.json b/apps/ledger-live-mobile/src/locales/fr/common.json index 3af64d5d94e1..c8e150afe9ce 100644 --- a/apps/ledger-live-mobile/src/locales/fr/common.json +++ b/apps/ledger-live-mobile/src/locales/fr/common.json @@ -891,9 +891,9 @@ "open" : "Ouvrir autorisa. des apps", "authorize" : "Autoriser", "bluetooth" : { - "modalTitle" : "Autorisation requise pour appairer votre Ledger via Bluetooth", - "modalDescriptionBase" : "Pour appairer votre Ledger via Bluetooth, autorisez Ledger Live à rechercher les appareils à proximité.", - "modalDescriptionSettingsVariant" : "Pour appairer votre Ledger via Bluetooth, accédez aux paramètres de votre téléphone et autorisez Ledger Live à rechercher les appareils à proximité.", + "modalTitle" : "Autorisation requise pour appairer votre appareil Ledger via Bluetooth", + "modalDescriptionBase" : "Pour appairer votre appareil Ledger via Bluetooth, autorisez Ledger Live à rechercher les appareils à proximité.", + "modalDescriptionSettingsVariant" : "Pour appairer votre appareil Ledger via Bluetooth, accédez aux paramètres de votre téléphone et autorisez Ledger Live à rechercher les appareils à proximité.", "modalButtonLabelBase" : "Autoriser", "modalButtonLabelSettingsVariant" : "Accéder aux Paramètres", "dontPair" : "Ne pas appairer" @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "Connectez votre wallet aux dApps" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "Récupérez votre wallet, tout simplement", + "tag" : "Un mois offert" } }, "signMessage" : { @@ -4205,7 +4210,7 @@ "installUpdate" : { "titleInactive" : "Installer la mise à jour", "titleActive" : "Installation de la mise à jour", - "description" : "Votre {{deviceName}} redémarrera plusieurs fois.\n\nUne fois la mise à jour installée sur votre {{deviceName}}, déverrouillez votre appareil pour terminer le processus." + "description" : "Votre {{deviceName}} va redémarrer plusieurs fois.\n\nUne fois la mise à jour installée sur votre {{deviceName}}, déverrouillez votre appareil pour terminer le processus." }, "restoreSettings" : { "earlySecurityCheck" : { @@ -6247,7 +6252,7 @@ }, "confirmCrop" : "Confirmer le recadrage", "confirmContrast" : "Confirmer le contraste", - "nftEntryPointButtonLabel" : "Afficher sur l’écran du Ledger Stax", + "nftEntryPointButtonLabel" : "Définir comme fond d’écran sur Ledger Stax", "customImage" : "Fond d’écran personnalisé", "doThisLater" : "Pas maintenant", "preview" : { @@ -6306,7 +6311,7 @@ "tagLabel" : "Cadeau" }, "assetsTransfer" : { - "title" : "Transférez vos actifs vers votre wallet Ledger", + "title" : "Transférer vos actifs vers votre wallet Ledger", "titleCompleted" : "Actifs transférés sur votre Ledger", "description" : "Envoyez-les depuis la plateforme d’échange ou le wallet de votre choix.", "popupLabel" : "Actifs transférés" @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "Services", "subTitle" : "Gérez vos services Ledger", + "signIn" : "Se connecter", + "recover" : { + "cta" : "Commencer votre essai gratuit", + "desc" : "Ne craignez plus de perdre l’accès à votre wallet.", + "tag" : "1 mois offert" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/ja/common.json b/apps/ledger-live-mobile/src/locales/ja/common.json index ec8023dfc994..5e501657a869 100644 --- a/apps/ledger-live-mobile/src/locales/ja/common.json +++ b/apps/ledger-live-mobile/src/locales/ja/common.json @@ -2620,13 +2620,13 @@ "resources" : "Ledgerリソース", "display" : { "title" : "一般", - "desc" : "Ledger Liveの一般設定を変更します。", + "desc" : "Ledger Liveの一般設定を変更する。", "carousel" : "おすすめ", "carouselDesc" : "お客様用にパーソナライズされたヒントと最新のオファーが記載されたカードをお見せします。", "language" : "表示言語", "languageDesc" : "Ledger Liveの表示言語を設定。", "dateFormat" : "日付形式", - "dateFormatDesc" : "Ledger Liveの日付形式を設定する", + "dateFormatDesc" : "Ledger Liveの日付形式を設定。", "region" : "地域", "regionDesc" : "地域を選択して日付や時間、通貨をアップデートする。", "password" : "パスワードロック", @@ -2646,7 +2646,7 @@ "stock" : "マーケットインジケーターの色分け", "stockDesc" : "マーケットの上昇を緑色で表示したい場合は「ウエスタン」、赤色で表示したい場合は「イースタン」を選択。", "reportErrors" : "バグレポート", - "reportErrorsDesc" : "製品の向上に役立つレポートを、Ledgerに自動的に送信します。", + "reportErrorsDesc" : "製品の向上に役立つレポートを、Ledgerに自動的に送信する。", "developerMode" : "デベロッパーモード", "developerModeDesc" : "管理ページに開発者用アプリを表示し、Testnetアプリを有効化。", "analytics" : "アナリティクス", @@ -2695,7 +2695,7 @@ "accounts" : { "header" : "アカウント", "title" : "アカウント", - "desc" : "アプリ内の資産の表示方法を管理します。", + "desc" : "アプリ内の資産の表示方法を管理する。", "hideTokenCTA" : "トークンを非表示", "showContractCTA" : "コントラクトを表示", "blacklistedTokens" : "非表示トークンリスト", @@ -2718,7 +2718,7 @@ }, "about" : { "title" : "Ledgerについて", - "desc" : "アプリ情報、利用規約、およびプライバシーポリシー。", + "desc" : "アプリ情報・利用規約・プライバシーポリシーを確認する。", "appDescription" : "Ledger Liveを使って暗号資産を安全に保管や売買、スワップをしながら、資産を管理して増やしましょう。すべてを1つの場所で。", "appVersion" : "バージョン", "termsConditions" : "利用規約", @@ -2734,7 +2734,7 @@ }, "notifications" : { "title" : "通知", - "desc" : "通知を管理", + "desc" : "通知を管理する。", "disabledNotifications" : { "title" : "通知はオフです", "desc" : "{{platform}}はLedger Liveからの通知をブロックしています。スマートフォンで通知を受信するには、デバイスの設定からLedger Liveの通知をオンにしてください。", @@ -2778,7 +2778,7 @@ "help" : { "title" : "ヘルプ", "header" : "ヘルプ", - "desc" : "Ledger Liveについての詳細や、ヘルプの利用方法についてはこちらをご覧ください。", + "desc" : "Ledger Liveの詳細やヘルプの利用方法を確認する。", "support" : "Ledgerサポート", "supportDesc" : "問題がある場合は、ハードウェアウォレットでLedger Liveを使用するためのヘルプを参照してください。", "configureDevice" : "デバイスのセットアップ", @@ -2797,7 +2797,7 @@ }, "experimental" : { "title" : "試験的機能", - "desc" : "試験的機能をお試しになり、フィードバックをお寄せください。", + "desc" : "試験的機能を試して、フィードバックを送る。", "disclaimer" : "これらは、テクノロジーファンのコミュニティ向けに、現状のまま提供される試験的機能です。これらの機能は随時変更、破損、または削除される可能性があります。このオプションを有効にすると、あなたは自己責任でこれらの機能を使用することに同意したことになります。", "provider" : "試験的設定「マイLedgerプロバイダー({{forcedProvider}})」では、リリースされていないOSとアプリが表示され、互換性の問題が発生する場合があります。これは設定で無効にできます。", "providerDevMode" : "試験的設定「My Ledgerプロバイダー({{forcedProvider}})」と「デベロッパーモード」では、リリースされていないOSとアプリが表示され、互換性の問題が発生する場合があります。設定にて無効にできます。", @@ -2853,7 +2853,7 @@ }, "developer" : { "title" : "デベロッパー", - "desc" : "試験的機能をお試しになり、フィードバックをお寄せください。", + "desc" : "試験的機能を試して、フィードバックを送る。", "customManifest" : { "title" : "カスタムプラットフォームマニフェストを読み込む" } @@ -3006,22 +3006,22 @@ }, "buy" : { "title" : "購入", - "description" : "暗号資産を現金で安全に購入。" + "description" : "暗号資産を安全に購入する。" }, "sell" : { "title" : "売却", - "description" : "暗号資産を安全に売却して現金化。" + "description" : "暗号資産を安全に売却する。" }, "exchange" : { "title" : "購入/売却" }, "stake" : { "title" : "ステーキング", - "description" : "暗号資産を運用しましょう。" + "description" : "暗号資産を運用する。" }, "swap" : { "title" : "スワップ", - "description" : "暗号資産を別の暗号資産と交換。", + "description" : "暗号資産を別の暗号資産と交換する。", "selectDevice" : "お使いのデバイスを選択してください", "broadcasting" : "スワップをブロードキャスト中", "loadingFees" : "ネットワーク手数料を読み込み中…", @@ -3404,7 +3404,12 @@ }, "walletConnect" : { "title" : "WalletConnect", - "description" : "ウォレットをdappsに接続" + "description" : "ウォレットをDAppに接続する。" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "手軽にウォレットを復元", + "tag" : "1ヶ月間無料" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "サービス", "subTitle" : "Ledgerサービスを管理", + "signIn" : "サインイン", + "recover" : { + "cta" : "無料トライアルを開始", + "desc" : "ウォレットへのアクセス権を失う不安を解消しましょう。", + "tag" : "1ヶ月間無料" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/ko/common.json b/apps/ledger-live-mobile/src/locales/ko/common.json index 7c5cdeb48923..db7763653eb8 100644 --- a/apps/ledger-live-mobile/src/locales/ko/common.json +++ b/apps/ledger-live-mobile/src/locales/ko/common.json @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "지갑을 디앱에 연결합니다" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "손쉬운 지갑 복구", + "tag" : "한 달 무료" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "서비스", "subTitle" : "Ledger 서비스 관리", + "signIn" : "로그인", + "recover" : { + "cta" : "무료 평가판을 시작하세요", + "desc" : "지갑 잠김에 대해 걱정하지 마세요.", + "tag" : "1달 무료" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/pt-BR/common.json b/apps/ledger-live-mobile/src/locales/pt-BR/common.json index bee32ee2b5d8..dd8f11aa67ca 100644 --- a/apps/ledger-live-mobile/src/locales/pt-BR/common.json +++ b/apps/ledger-live-mobile/src/locales/pt-BR/common.json @@ -2799,8 +2799,8 @@ "title" : "Recursos experimentais", "desc" : "Ative os recursos experimentais e nos conte o que achou.", "disclaimer" : "Estes são recursos experimentais que fornecemos \"tal como se encontram\" para serem testados pela nossa comunidade de especialistas em tecnologia. Eles podem mudar, quebrar ou ser removidos a qualquer momento. Ao habilitá-los, você concorda em usá-los por sua conta e risco.", - "provider" : "A configuração experimental \"Provedor da Minha Ledger ({{forcedProvider}})\" pode mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas compatibilidade. Você pode desativá-la nas configurações.", - "providerDevMode" : "As configurações experimentais \"Provedor da Minha Ledger ({{forcedProvider}})\" e \"Modo desenvolvedor\" podem mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas compatibilidade. Você pode desativá-las nas configurações.", + "provider" : "A configuração experimental \"Provedor da Minha Ledger ({{forcedProvider}})\" pode mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas de compatibilidade. Você pode desativá-la nas configurações.", + "providerDevMode" : "As configurações experimentais \"Provedor da Minha Ledger ({{forcedProvider}})\" e \"Modo desenvolvedor\" podem mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas de compatibilidade. Você pode desativá-las nas configurações.", "devMode" : "A configuração experimental \"Modo desenvolvedor\" pode mostrar sistemas operacionais e aplicativos ainda não lançados, o que pode causar problemas de compatibilidade. Você pode desativá-la nas configurações.", "providerCTA" : "Ir para Configurações", "experimentalFeatures" : { @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "Conecte sua carteira a DApps." + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "Nunca perca o acesso à sua cripto", + "tag" : "Um mês grátis" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "Serviços", "subTitle" : "Gerenciar seus serviços Ledger", + "signIn" : "Entrar", + "recover" : { + "cta" : "Iniciar sua avaliação gratuita", + "desc" : "Nunca mais se preocupe em perder acesso à sua carteira.", + "tag" : "1 mês grátis" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/ru/common.json b/apps/ledger-live-mobile/src/locales/ru/common.json index 3b3655400fd8..fd5bcadb02c4 100644 --- a/apps/ledger-live-mobile/src/locales/ru/common.json +++ b/apps/ledger-live-mobile/src/locales/ru/common.json @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "Подключите кошелёк к децентрализованным приложениям." + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "Восстановить кошелёк теперь проще простого", + "tag" : "Месяц в подарок" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "Сервисы", "subTitle" : "Управление услугами Ledger", + "signIn" : "Войти", + "recover" : { + "cta" : "Попробовать бесплатно", + "desc" : "Хватит беспокоиться о возможной потере доступа к своему кошельку.", + "tag" : "1 месяц в подарок" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/tr/common.json b/apps/ledger-live-mobile/src/locales/tr/common.json index b6cd534eaf7f..36fdd0f9b553 100644 --- a/apps/ledger-live-mobile/src/locales/tr/common.json +++ b/apps/ledger-live-mobile/src/locales/tr/common.json @@ -906,9 +906,9 @@ }, "camera" : { "title" : "Kamera izni", - "authorizeDescription" : "QR kodlarını taramak için lütfen Kameraya erişim izni verin.", + "authorizeDescription" : "Karekodları okutmak için lütfen Kameraya erişim izni verin.", "authorizeButtonTitle" : "İzin ver", - "goToSettingsDescription" : "QR kodlarını taramak için lütfen Ayarlar kısmından Kameraya erişim izni verin.", + "goToSettingsDescription" : "Karekodları okutmak için lütfen Ayarlar kısmından Kameraya erişim izni verin.", "goToSettingsButtonTitle" : "Ayarlara git" } }, @@ -1584,13 +1584,13 @@ "label" : "Seçmek için iki tuşa aynı anda basın." }, "1" : { - "title" : "“Ledger Recover kullanarak geri yükle” seçimini yapın", + "title" : "“Restore using Ledger Recover” (Ledger Recover kullanarak geri yükle) seçimini yapın", "label" : "Seçmek için iki tuşa aynı anda basın." } }, "nextStep" : "Devam", "extraInfo" : { - "tooltip" : "“Ledger Recover kullanarak geri yükle” seçeneği yok", + "tooltip" : "“Restore using Ledger Recover” (Ledger Recover kullanarak geri yükle) seçeneği yok", "title" : "Ledger Nano X cihazındaki işletim sisteminin güncellenmesi gerekiyor", "desc" : "İşletim sistemini güncellemeyi deneyebilir veya yardım almak için Ledger Destek ile iletişime geçebilirsiniz.", "cta" : "Güncelleme yönergeleri", @@ -2464,7 +2464,7 @@ "instructions" : { "line1" : "Ledger Live Masaüstü sürümünü açın.", "line2" : "Ayarlar > Hesaplar > Hesapları dışa aktar", - "line3" : "Yükleyici %100 olana kadar QR kodunu tarayın." + "line3" : "Yükleyici %100 olana kadar karekodu tarayın." }, "hodl" : "Tarama işlemi tamamlanana kadar tutun." }, @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "Cüzdanınızı dApp'lere bağlayın" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "Cüzdan kurtarmak artık çok kolay", + "tag" : "Bir ay ücretsiz" } }, "signMessage" : { @@ -3429,12 +3434,12 @@ }, "highFeeModal" : "Dikkatli olun; ağ ücretleri tutarın <1>%10'undan fazla. Devam etmek istiyor musunuz?", "scan" : { - "title" : "QR kodunu tarayın", - "descBottom" : "Lütfen QR kodunu karenin içine ortalayın.", + "title" : "Karekodu okutun", + "descBottom" : "Lütfen karekodu karenin içine ortalayın.", "fallback" : { - "header" : "QR kodunu tarayın", + "header" : "Karekodu okutun", "title" : "Kamerayı etkinleştirin", - "desc" : "QR kodlarını taramak için lütfen Ayarlardan Kamerayı etkinleştirin.", + "desc" : "Karekodları okutmak için lütfen Ayarlardan Kamerayı etkinleştirin.", "buttonTitle" : "Ayarlara Git" } }, @@ -3451,7 +3456,7 @@ "selectNft" : "NFT" }, "recipient" : { - "scan" : "QR kodunu tarayın", + "scan" : "Karekodu okutun", "enterAddress" : "Adresi girin", "input" : "Adresi girin", "verifyAddress" : "Adresin, alıcıyla paylaşılan adres ile eşleştiğini doğrulayın.", @@ -6273,9 +6278,9 @@ "backButton" : "Market Pass'imi aldım" }, "qrScan" : { - "title" : "Ledger Market Pass'inizdeki QR kodunu taratın", + "title" : "Ledger Market Pass'inizdeki karekodu taratın", "description" : { - "1" : "Özel Ledger Market Pass'inizi, Ledger Stax'inizin kutusunda bulabilirsiniz.\n\nPass'in arkasındaki QR kodunu çerçevenin içine oturtarak işleme başlayın. Kartı aydınlık bir ortamda, açık renkli ve sade bir arka plan üzerinde tutun." + "1" : "Özel Ledger Market Pass'inizi, Ledger Stax'inizin kutusunda bulabilirsiniz.\n\nPass'in arkasındaki karekodu çerçevenin içine oturtarak işleme başlayın. Kartı aydınlık bir ortamda, açık renkli ve sade bir arka plan üzerinde tutun." } } }, @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "Hizmetler", "subTitle" : "Ledger hizmetlerinizi yönetin", + "signIn" : "Oturum aç", + "recover" : { + "cta" : "Ücretsiz denemenizi başlatın", + "desc" : "Cüzdanınıza erişiminizi kaybetmekten korkmayın.", + "tag" : "1 ay ücretsiz" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/locales/zh/common.json b/apps/ledger-live-mobile/src/locales/zh/common.json index 053a24c0c8fb..66166b1c4dd2 100644 --- a/apps/ledger-live-mobile/src/locales/zh/common.json +++ b/apps/ledger-live-mobile/src/locales/zh/common.json @@ -3405,6 +3405,11 @@ "walletConnect" : { "title" : "WalletConnect", "description" : "将您的钱包连接到去中心化应用程序" + }, + "recover" : { + "title" : "Ledger Recover", + "description" : "钱包恢复,垂手可得", + "tag" : "免费一个月" } }, "signMessage" : { @@ -6365,6 +6370,12 @@ "servicesWidget" : { "title" : "服务", "subTitle" : "管理您的 Ledger 服务", + "signIn" : "登录", + "recover" : { + "cta" : "开始免费试用", + "desc" : "无需再为失去对您钱包的访问权而担忧。", + "tag" : "免费一个月" + }, "protect" : { "status" : { "new" : { diff --git a/apps/ledger-live-mobile/src/screens/Onboarding/steps/protectFlow.tsx b/apps/ledger-live-mobile/src/screens/Onboarding/steps/protectFlow.tsx index 0aa60371f4b3..a9ae7cc84396 100644 --- a/apps/ledger-live-mobile/src/screens/Onboarding/steps/protectFlow.tsx +++ b/apps/ledger-live-mobile/src/screens/Onboarding/steps/protectFlow.tsx @@ -15,7 +15,10 @@ import { } from "../../../components/RootNavigator/types/helpers"; import { OnboardingNavigatorParamList } from "../../../components/RootNavigator/types/OnboardingNavigator"; import { Step } from "./setupDevice/scenes/BaseStepperView"; -import { lastConnectedDeviceSelector } from "../../../reducers/settings"; +import { + hasCompletedOnboardingSelector, + lastConnectedDeviceSelector, +} from "../../../reducers/settings"; type Metadata = { id: string; @@ -33,6 +36,7 @@ function OnboardingStepProtectFlow({ navigation, route }: NavigationProps) { const { theme } = useTheme(); const lastConnectedDevice = useSelector(lastConnectedDeviceSelector); + const hasCompletedOnboarding = useSelector(hasCompletedOnboardingSelector); const protectFeature = useFeature("protectServicesMobile"); const dispatch = useDispatch(); @@ -67,11 +71,11 @@ function OnboardingStepProtectFlow({ navigation, route }: NavigationProps) { dispatch(completeOnboarding()); resetCurrentStep(); - if (protectFeature?.enabled && lastConnectedDevice) { + if (protectFeature?.enabled && (lastConnectedDevice || !hasCompletedOnboarding)) { navigation.navigate(NavigatorName.Base, { screen: ScreenName.Recover, params: { - device: lastConnectedDevice, + device: lastConnectedDevice || undefined, platform: protectFeature.params?.protectId, redirectTo: "restore", date: new Date().toISOString(), // adding a date to reload the page in case of same device restored again @@ -80,6 +84,7 @@ function OnboardingStepProtectFlow({ navigation, route }: NavigationProps) { } }, [ dispatch, + hasCompletedOnboarding, lastConnectedDevice, navigation, protectFeature?.enabled, diff --git a/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx b/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx index 8002c1fc92da..d728cdcef7a8 100644 --- a/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx +++ b/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx @@ -114,18 +114,21 @@ function OnboardingStepWelcome({ navigation }: NavigationProps) { ? videoSources.welcomeScreenStax : videoSources.welcomeScreen; - const recoverFeature = useFeature("protectServicesMobile"); + { + /* @TODO need to disable temporary because of issue pairing device onboarding RECOVER - LLM + const recoverFeature = useFeature("protectServicesMobile"); + const recoverLogIn = useCallback(() => { + acceptTerms(); + dispatch(setAnalytics(true)); - const recoverLogIn = useCallback(() => { - acceptTerms(); - dispatch(setAnalytics(true)); - - const url = `${recoverFeature?.params?.login?.loginURI}&shouldBypassLLOnboarding=true`; + const url = `${recoverFeature?.params?.account?.loginURI}&shouldBypassLLOnboarding=true`; - Linking.canOpenURL(url).then(canOpen => { - if (canOpen) Linking.openURL(url); - }); - }, [acceptTerms, dispatch, recoverFeature?.params?.login?.loginURI]); + Linking.canOpenURL(url).then(canOpen => { + if (canOpen) Linking.openURL(url); + }); + }, [acceptTerms, dispatch, recoverFeature?.params?.login?.loginURI]); + */ + } return ( @@ -208,12 +211,14 @@ function OnboardingStepWelcome({ navigation }: NavigationProps) { {t("onboarding.stepWelcome.start")} {/* @TODO check if proper URL */} + {/* @TODO need to disable temporary because of issue pairing device onboarding {recoverFeature?.enabled && - recoverFeature?.params?.onboardingRestore.postOnboardingURI ? ( + recoverFeature?.params?.onboardingRestore?.postOnboardingURI ? ( ) : null} + */} {t("onboarding.stepWelcome.terms")} diff --git a/apps/ledger-live-mobile/src/screens/Portfolio/index.tsx b/apps/ledger-live-mobile/src/screens/Portfolio/index.tsx index e8e35125cd1f..60e54ecb10f5 100644 --- a/apps/ledger-live-mobile/src/screens/Portfolio/index.tsx +++ b/apps/ledger-live-mobile/src/screens/Portfolio/index.tsx @@ -8,13 +8,18 @@ import { useTheme } from "styled-components/native"; import useEnv from "@ledgerhq/live-common/hooks/useEnv"; import { ReactNavigationPerformanceView } from "@shopify/react-native-performance-navigation"; import { useFeature } from "@ledgerhq/live-common/featureFlags/index"; -import { useLearnMoreURI } from "@ledgerhq/live-common/hooks/recoverFeatureFlag"; +import { + useAlreadyOnboardedURI, + usePostOnboardingURI, + useHomeURI, +} from "@ledgerhq/live-common/hooks/recoverFeatureFlag"; import { useRefreshAccountsOrdering } from "../../actions/general"; import { // TODO: discreetMode is never used 😱 is it safe to remove // discreetModeSelector, hasBeenUpsoldProtectSelector, lastConnectedDeviceSelector, + onboardingTypeSelector, } from "../../reducers/settings"; import { setHasBeenUpsoldProtect } from "../../actions/settings"; @@ -48,6 +53,7 @@ import { import PortfolioAssets from "./PortfolioAssets"; import { internetReachable } from "../../logic/internetReachable"; import { UpdateStep } from "../FirmwareUpdate"; +import { OnboardingType } from "../../reducers/types"; export { default as PortfolioTabIcon } from "./TabIcon"; @@ -69,8 +75,11 @@ function PortfolioScreen({ navigation }: NavigationProps) { const [isAddModalOpened, setAddModalOpened] = useState(false); const { colors } = useTheme(); const { isAWalletCardDisplayed } = useDynamicContent(); + const onboardingType = useSelector(onboardingTypeSelector); const protectFeature = useFeature("protectServicesMobile"); - const recoverUpsellURL = useLearnMoreURI(protectFeature); + const recoverAlreadyOnboardedURI = useAlreadyOnboardedURI(protectFeature); + const recoverPostOnboardingURI = usePostOnboardingURI(protectFeature); + const recoverHomeURI = useHomeURI(protectFeature); const dispatch = useDispatch(); const onBackFromUpdate = useCallback( @@ -83,8 +92,14 @@ function PortfolioScreen({ navigation }: NavigationProps) { useEffect(() => { const openProtectUpsell = async () => { const internetConnected = await internetReachable(); - if (internetConnected && recoverUpsellURL && protectFeature?.enabled) { - Linking.openURL(recoverUpsellURL); + if (internetConnected && protectFeature?.enabled) { + if (recoverPostOnboardingURI && onboardingType === OnboardingType.restore) { + Linking.openURL(recoverPostOnboardingURI); + } else if (recoverHomeURI && onboardingType === OnboardingType.setupNew) { + Linking.openURL(recoverHomeURI); + } else if (recoverAlreadyOnboardedURI) { + Linking.openURL(recoverAlreadyOnboardedURI); + } } }; if (!hasBeenUpsoldProtect && lastConnectedDevice?.modelId === "nanoX") { @@ -92,9 +107,12 @@ function PortfolioScreen({ navigation }: NavigationProps) { dispatch(setHasBeenUpsoldProtect(true)); } }, [ + onboardingType, hasBeenUpsoldProtect, lastConnectedDevice, - recoverUpsellURL, + recoverPostOnboardingURI, + recoverAlreadyOnboardedURI, + recoverHomeURI, dispatch, protectFeature?.enabled, ]); diff --git a/apps/web-tools/CHANGELOG.md b/apps/web-tools/CHANGELOG.md index f8f7b34af982..21bff726d21d 100644 --- a/apps/web-tools/CHANGELOG.md +++ b/apps/web-tools/CHANGELOG.md @@ -1,5 +1,45 @@ # web-tools +## 0.1.2 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1 + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/domain-service@1.1.13 + - @ledgerhq/hw-app-eth@6.34.8 + +## 0.1.2-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1-hotfix.2 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + - @ledgerhq/domain-service@1.1.13-hotfix.1 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.1 + +## 0.1.2-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + - @ledgerhq/live-common@33.0.1-hotfix.1 + +## 0.1.2-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/live-common@33.0.1-hotfix.0 + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.0 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.0 + ## 0.1.1 ### Patch Changes diff --git a/apps/web-tools/package.json b/apps/web-tools/package.json index 5aca110ed8b7..e126972fd32c 100644 --- a/apps/web-tools/package.json +++ b/apps/web-tools/package.json @@ -1,6 +1,6 @@ { "name": "web-tools", - "version": "0.1.1", + "version": "0.1.2", "private": true, "browser": { "fs": false, diff --git a/libs/coin-algorand/CHANGELOG.md b/libs/coin-algorand/CHANGELOG.md index c079b78dcc68..b6b1561deae7 100644 --- a/libs/coin-algorand/CHANGELOG.md +++ b/libs/coin-algorand/CHANGELOG.md @@ -1,5 +1,37 @@ # @ledgerhq/coin-algorand +## 0.3.4 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/cryptoassets@11.0.1 + +## 0.3.4-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + +## 0.3.4-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + +## 0.3.4-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + ## 0.3.3 ### Patch Changes diff --git a/libs/coin-algorand/package.json b/libs/coin-algorand/package.json index 7951c1c42a70..b53976821d3c 100644 --- a/libs/coin-algorand/package.json +++ b/libs/coin-algorand/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/coin-algorand", - "version": "0.3.3", + "version": "0.3.4", "description": "Ledger Algorand Coin integration", "keywords": [ "Ledger", diff --git a/libs/coin-evm/CHANGELOG.md b/libs/coin-evm/CHANGELOG.md index af91add2b8ea..3bd4ee06c070 100644 --- a/libs/coin-evm/CHANGELOG.md +++ b/libs/coin-evm/CHANGELOG.md @@ -1,5 +1,54 @@ # @ledgerhq/coin-evm +## 0.9.0 + +### Minor Changes + +- [#5042](https://github.com/LedgerHQ/ledger-live/pull/5042) [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Ensure compatiblity with @ledgerhq/coin-framework change regarding `TokenAccounts` ids & update `preload` & `hydrate` method to use the `convertBEP20` method instead of the `convertERC20` method when dealing with the bsc chain. This last fix is technically useless as BEP20 = ERC20, it's only here in order to prevent breaking changes with the different backends at Ledger. As soon as those backends have the possibility of changing the "bsc/bep20/XYZ" token ids into "bsc/erc20/XYZ", this fix should be removed in order to avoid useless complexity. + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/cryptoassets@11.0.1 + - @ledgerhq/domain-service@1.1.13 + - @ledgerhq/evm-tools@1.0.9 + - @ledgerhq/hw-app-eth@6.34.8 + +## 0.9.0-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + - @ledgerhq/domain-service@1.1.13-hotfix.1 + - @ledgerhq/evm-tools@1.0.9-hotfix.0 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.1 + +## 0.9.0-hotfix.1 + +### Minor Changes + +- [#5042](https://github.com/LedgerHQ/ledger-live/pull/5042) [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Ensure compatiblity with @ledgerhq/coin-framework change regarding `TokenAccounts` ids & update `preload` & `hydrate` method to use the `convertBEP20` method instead of the `convertERC20` method when dealing with the bsc chain. This last fix is technically useless as BEP20 = ERC20, it's only here in order to prevent breaking changes with the different backends at Ledger. As soon as those backends have the possibility of changing the "bsc/bep20/XYZ" token ids into "bsc/erc20/XYZ", this fix should be removed in order to avoid useless complexity. + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + +## 0.8.1-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.0 + - @ledgerhq/evm-tools@1.0.8 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.0 + ## 0.8.0 ### Minor Changes diff --git a/libs/coin-evm/package.json b/libs/coin-evm/package.json index ff1c45212ffa..f9c551444876 100644 --- a/libs/coin-evm/package.json +++ b/libs/coin-evm/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/coin-evm", - "version": "0.8.0", + "version": "0.9.0", "description": "Ledger EVM Coin integration", "keywords": [ "Ledger", diff --git a/libs/coin-evm/src/__tests__/fixtures/synchronization.fixtures.ts b/libs/coin-evm/src/__tests__/fixtures/synchronization.fixtures.ts index 1a0c94923469..ca39b97b45c4 100644 --- a/libs/coin-evm/src/__tests__/fixtures/synchronization.fixtures.ts +++ b/libs/coin-evm/src/__tests__/fixtures/synchronization.fixtures.ts @@ -70,7 +70,7 @@ export const coinOperations = [ export const tokenOperations = [ makeOperation({ hash: coinOperations[0].hash, // on purpose to make this token op a subOp of coinOp 1 - accountId: "js:2:ethereum:0xkvn:+ethereum%2Ferc20%2Fusd__coin", + accountId: "js:2:ethereum:0xkvn:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin", blockHash: "0x95dc138a02c1b0e3fd49305f785e8e27e88a885004af13a9b4c62ad94eed07dd", recipients: ["0xB0B"], senders: ["0x9b744C0451D73C0958d8aA566dAd33022E4Ee797"], // sbf.eth @@ -83,14 +83,14 @@ export const tokenOperations = [ }), makeOperation({ hash: "0xTokenHashAga1n", - accountId: "js:2:ethereum:0xkvn:+ethereum%2Ferc20%2Fusd__coin", + accountId: "js:2:ethereum:0xkvn:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin", contract: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", date: new Date(Date.now() + 1), blockHeight: 1000, }), makeOperation({ hash: "0xTokenHashAga1n", - accountId: "js:2:ethereum:0xkvn:+ethereum%2Ferc20%2Fusd__coin", + accountId: "js:2:ethereum:0xkvn:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin", contract: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", date: new Date(Date.now() + 2), blockHeight: 10000, diff --git a/libs/coin-evm/src/__tests__/unit/adapters/etherscan.unit.test.ts b/libs/coin-evm/src/__tests__/unit/adapters/etherscan.unit.test.ts index 1ba969042d2c..41de08ece52a 100644 --- a/libs/coin-evm/src/__tests__/unit/adapters/etherscan.unit.test.ts +++ b/libs/coin-evm/src/__tests__/unit/adapters/etherscan.unit.test.ts @@ -390,7 +390,7 @@ describe("EVM Family", () => { const tokenAccountId = encodeTokenAccountId(accountId, tokenCurrency!); const expectedOperation: Operation = { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-OUT-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-OUT-i0", hash: "0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf", accountId: tokenAccountId, blockHash: "0x58ee7556044cd139e569c87c173a6dedbfbeb9ada6693ee6090fd510acee9c21", @@ -445,7 +445,7 @@ describe("EVM Family", () => { const tokenAccountId = encodeTokenAccountId(accountId, tokenCurrency!); const expectedOperation: Operation = { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-IN-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-IN-i0", hash: "0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf", accountId: tokenAccountId, blockHash: "0x58ee7556044cd139e569c87c173a6dedbfbeb9ada6693ee6090fd510acee9c21", @@ -535,7 +535,7 @@ describe("EVM Family", () => { const expectedOperations: Operation[] = [ { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-IN-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-IN-i0", hash: "0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf", accountId: tokenAccountId, blockHash: "0x58ee7556044cd139e569c87c173a6dedbfbeb9ada6693ee6090fd510acee9c21", @@ -551,7 +551,7 @@ describe("EVM Family", () => { extra: {}, }, { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-OUT-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf-OUT-i0", hash: "0x02b972f304dc24c9bc362e6435c4ad654241f9af916689a4790145c9bcbdf4cf", accountId: tokenAccountId, blockHash: "0x58ee7556044cd139e569c87c173a6dedbfbeb9ada6693ee6090fd510acee9c21", diff --git a/libs/coin-evm/src/__tests__/unit/adapters/ledger.unit.test.ts b/libs/coin-evm/src/__tests__/unit/adapters/ledger.unit.test.ts index 2b5d32a66148..f763875c89b3 100644 --- a/libs/coin-evm/src/__tests__/unit/adapters/ledger.unit.test.ts +++ b/libs/coin-evm/src/__tests__/unit/adapters/ledger.unit.test.ts @@ -465,7 +465,7 @@ describe("EVM Family", () => { }; const expectedOperation: Operation = { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-OUT-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-OUT-i0", hash: "0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79", accountId: encodeTokenAccountId(accountId, tokenCurrency), blockHash: "0xcbd52de09904fd89a94b0638a8e39107e247d761e92411fd5b7b7d8b88641ddd", @@ -495,7 +495,7 @@ describe("EVM Family", () => { }; const expectedOperation: Operation = { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-IN-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-IN-i0", hash: "0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79", accountId: encodeTokenAccountId(accountId, tokenCurrency), blockHash: "0xcbd52de09904fd89a94b0638a8e39107e247d761e92411fd5b7b7d8b88641ddd", @@ -536,7 +536,7 @@ describe("EVM Family", () => { }; const expectedOperation1: Operation = { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-IN-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-IN-i0", hash: "0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79", accountId: encodeTokenAccountId(accountId, tokenCurrency), blockHash: "0xcbd52de09904fd89a94b0638a8e39107e247d761e92411fd5b7b7d8b88641ddd", @@ -552,7 +552,7 @@ describe("EVM Family", () => { extra: {}, }; const expectedOperation2: Operation = { - id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd__coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-OUT-i0", + id: "js:2:ethereum:0x6cbcd73cd8e8a42844662f0a0e76d7f79afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-OUT-i0", hash: "0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79", accountId: encodeTokenAccountId(accountId, tokenCurrency), blockHash: "0xcbd52de09904fd89a94b0638a8e39107e247d761e92411fd5b7b7d8b88641ddd", diff --git a/libs/coin-evm/src/__tests__/unit/api/explorer/ledger.unit.test.ts b/libs/coin-evm/src/__tests__/unit/api/explorer/ledger.unit.test.ts index ae3ea623f2c2..713e7ac81c9e 100644 --- a/libs/coin-evm/src/__tests__/unit/api/explorer/ledger.unit.test.ts +++ b/libs/coin-evm/src/__tests__/unit/api/explorer/ledger.unit.test.ts @@ -322,8 +322,8 @@ describe("EVM Family", () => { ], lastTokenOperations: [ { - id: "js:2:ethereum:0x6cBCD73CD8e8a42844662f0A0e76D7F79Afd933d:+ethereum%2Ferc20%2Fusd__coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-OUT-i0", - accountId: accountId + "+ethereum%2Ferc20%2Fusd__coin", + id: "js:2:ethereum:0x6cBCD73CD8e8a42844662f0A0e76D7F79Afd933d:+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin-0xf350d4f8e910419e2d5cec294d44e69af8c6185b7089061d33bb4fc246cefb79-OUT-i0", + accountId: accountId + "+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin", blockHash: coinOperation1.block.hash, blockHeight: coinOperation1.block.height, contract: eip55.encode(coinOperation1.to), diff --git a/libs/coin-evm/src/__tests__/unit/logic.unit.test.ts b/libs/coin-evm/src/__tests__/unit/logic.unit.test.ts index a297250bd7fc..5313ae7f711b 100644 --- a/libs/coin-evm/src/__tests__/unit/logic.unit.test.ts +++ b/libs/coin-evm/src/__tests__/unit/logic.unit.test.ts @@ -539,20 +539,25 @@ describe("EVM Family", () => { const coinOperation = makeOperation({ hash: "0xCoinOp3Hash", }); + const tokenAccountId = + coinOperation.accountId + "+ethereum%2Ferc20%2Fusd~!underscore!~~!underscore!~coin"; const tokenOperations = [ makeOperation({ + accountId: tokenAccountId, hash: coinOperation.hash, contract: "0xTokenContract", value: new BigNumber(1), type: "OUT", }), makeOperation({ + accountId: tokenAccountId, hash: coinOperation.hash, contract: "0xTokenContract", value: new BigNumber(2), type: "IN", }), makeOperation({ + accountId: tokenAccountId, hash: "0xUnknownHash", contract: "0xOtherTokenContract", value: new BigNumber(2), diff --git a/libs/coin-evm/src/__tests__/unit/preload.unit.test.ts b/libs/coin-evm/src/__tests__/unit/preload.unit.test.ts index 360d04f280ca..71d97bfd4394 100644 --- a/libs/coin-evm/src/__tests__/unit/preload.unit.test.ts +++ b/libs/coin-evm/src/__tests__/unit/preload.unit.test.ts @@ -3,7 +3,7 @@ jest.useFakeTimers(); import network from "@ledgerhq/live-network/network"; import evms from "@ledgerhq/cryptoassets/data/evm/index"; -import { ERC20Token } from "@ledgerhq/cryptoassets/types"; +import { BEP20Token, ERC20Token } from "@ledgerhq/cryptoassets/types"; import * as CALTokensAPI from "@ledgerhq/cryptoassets/tokens"; import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets"; import { fetchERC20Tokens, hydrate, preload } from "../../preload"; @@ -34,15 +34,29 @@ const usdtDefinition: ERC20Token = [ undefined, undefined, ]; +const binanceDaiDefinition: BEP20Token = [ + "bsc", + "binance-peg_dai_token", + "DAI", + 18, + "Binance-Peg Dai Token", + "3044022032f0a880722af8c9e2196b5c0fc5273e2088f23692bdd2b35f6cf41c4001213f02205226e2023e409c73b031c790c64ae24db67c04b0aefd0d979b8c5002ca969b7b", + "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3", + true, + false, +]; const currency1 = getCryptoCurrencyById("ethereum"); // chain id 1 +const currency2 = getCryptoCurrencyById("bsc"); // chain id 56 jest.mock("@ledgerhq/live-network/network"); jest.mock("@ledgerhq/cryptoassets/data/evm/index", () => ({ get tokens(): { 1: ERC20Token[]; + 56: BEP20Token[]; } { return { 1: [usdcDefinition], + 56: [binanceDaiDefinition], }; }, })); @@ -72,7 +86,7 @@ describe("EVM Family", () => { expect(network).toHaveBeenCalledTimes(2); }); - it("should load dynamically the tokens", async () => { + it("should load dynamically the ERC20 tokens", async () => { // @ts-expect-error not casted as jest mock network.mockResolvedValue({ data: [usdtDefinition] }); @@ -80,6 +94,14 @@ describe("EVM Family", () => { expect(tokens).toEqual([usdtDefinition]); }); + it("should load dynamically the BEP20 tokens", async () => { + // @ts-expect-error not casted as jest mock + network.mockResolvedValue({ data: [binanceDaiDefinition] }); + + const tokens = await fetchERC20Tokens(currency2); + expect(tokens).toEqual([binanceDaiDefinition]); + }); + it("should fallback on local CAL on dynamic CAL error", async () => { // @ts-expect-error not casted as jest mock network.mockImplementationOnce(async () => { @@ -88,23 +110,29 @@ describe("EVM Family", () => { const tokens = await fetchERC20Tokens(currency1); expect(tokens).toEqual([usdcDefinition]); + const bep20tokens = await fetchERC20Tokens(currency2); + expect(bep20tokens).toEqual([binanceDaiDefinition]); }); it("should load erc20 tokens from local CAL when dynamic CAL undefined", async () => { const tokens = await fetchERC20Tokens(currency1); expect(tokens).toEqual([usdcDefinition]); + const bep20tokens = await fetchERC20Tokens(currency2); + expect(bep20tokens).toEqual([binanceDaiDefinition]); }); it("should load erc20 tokens from local CAL when dynamic CAL is empty []", async () => { // @ts-expect-error not casted as jest mock network.mockResolvedValue({ data: { - tokens: { 1: [] }, + tokens: { 1: [], 56: [] }, }, }); - const tokens = await fetchERC20Tokens(currency1); - expect(tokens).toEqual([usdcDefinition]); + const erc20tokens = await fetchERC20Tokens(currency1); + expect(erc20tokens).toEqual([usdcDefinition]); + const bep20tokens = await fetchERC20Tokens(currency2); + expect(bep20tokens).toEqual([binanceDaiDefinition]); }); it("should return empty [] if dynamic CAL fails and local CAL fails", async () => { @@ -126,6 +154,17 @@ describe("EVM Family", () => { CALTokensAPI.convertERC20(usdcDefinition), ]); }); + + it("should register BEP20 tokens", async () => { + jest.spyOn(CALTokensAPI, "addTokens").mockImplementationOnce(() => null); + + const tokens = await preload(currency2); + + expect(tokens).toEqual([binanceDaiDefinition]); + expect(CALTokensAPI.addTokens).toHaveBeenCalledWith([ + CALTokensAPI.convertBEP20(binanceDaiDefinition), + ]); + }); }); describe("hydrate", () => { @@ -134,18 +173,29 @@ describe("EVM Family", () => { }); it("should return void", () => { - expect(hydrate(undefined)).toBe(undefined); + expect(hydrate(undefined, currency1)).toBe(undefined); + expect(hydrate(undefined, currency2)).toBe(undefined); }); - it("should register tokens", async () => { + it("should register ERC20 tokens", async () => { jest.spyOn(CALTokensAPI, "addTokens").mockImplementationOnce(() => null); - await hydrate([usdcDefinition]); + await hydrate([usdcDefinition], currency1); expect(CALTokensAPI.addTokens).toHaveBeenCalledWith([ CALTokensAPI.convertERC20(usdcDefinition), ]); }); + + it("should register BEP20 tokens", async () => { + jest.spyOn(CALTokensAPI, "addTokens").mockImplementationOnce(() => null); + + await hydrate([binanceDaiDefinition], currency2); + + expect(CALTokensAPI.addTokens).toHaveBeenCalledWith([ + CALTokensAPI.convertBEP20(binanceDaiDefinition), + ]); + }); }); }); }); diff --git a/libs/coin-evm/src/logic.ts b/libs/coin-evm/src/logic.ts index 7c327e92b723..04bfe60ba767 100644 --- a/libs/coin-evm/src/logic.ts +++ b/libs/coin-evm/src/logic.ts @@ -165,9 +165,23 @@ export const getSyncHash = (currency: CryptoCurrency): string => { .join(""); const isNftSupported = isNFTActive(currency); const { node = {}, explorer = {} } = currency.ethereumLikeInfo || {}; + // Did the migration of token accounts IDs + // e.g. binance-peg_bsc-usd to binance#!dash!#peg#!underscore!#bsc#!dash!#usd + // + // This could theorically be removed after a decent amount of releases (~3/4), + // just the time necessary for every user to have a different + // hash at least once to avoid duplicated TokenAccounts. + // For a user with duplicates, a "clear cache" + // shoud be enough to fix everything. + const hasSafeTokenIdAccount = true; + return ethers.utils.sha256( Buffer.from( - basicTokensListString + isNftSupported + JSON.stringify(node) + JSON.stringify(explorer), + basicTokensListString + + isNftSupported + + JSON.stringify(node) + + JSON.stringify(explorer) + + hasSafeTokenIdAccount, ), ); }; diff --git a/libs/coin-evm/src/preload.ts b/libs/coin-evm/src/preload.ts index 469a43f14723..38093c99035b 100644 --- a/libs/coin-evm/src/preload.ts +++ b/libs/coin-evm/src/preload.ts @@ -1,57 +1,62 @@ import { log } from "@ledgerhq/logs"; import { getEnv } from "@ledgerhq/live-env"; import network from "@ledgerhq/live-network/network"; -import { ERC20Token } from "@ledgerhq/cryptoassets/types"; import { makeLRUCache } from "@ledgerhq/live-network/cache"; import { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; -import { addTokens, convertERC20 } from "@ledgerhq/cryptoassets/tokens"; +import { BEP20Token, ERC20Token } from "@ledgerhq/cryptoassets/types"; import { tokens as tokensByChainId } from "@ledgerhq/cryptoassets/data/evm/index"; +import { addTokens, convertERC20, convertBEP20 } from "@ledgerhq/cryptoassets/tokens"; -export const fetchERC20Tokens: (currency: CryptoCurrency) => Promise = makeLRUCache( - async currency => { - const { ethereumLikeInfo } = currency; +export const fetchERC20Tokens: (currency: CryptoCurrency) => Promise = + makeLRUCache( + async currency => { + const { ethereumLikeInfo } = currency; - const url = `${getEnv("DYNAMIC_CAL_BASE_URL")}/evm/${ - ethereumLikeInfo?.chainId || 0 - }/erc20.json`; - const dynamicTokens: ERC20Token[] | null = await network({ - method: "GET", - url, - }) - .then(({ data }: { data: ERC20Token[] }) => (data.length ? data : null)) - .catch(e => { - log("error", "EVM Family: Couldn't fetch dynamic CAL tokens from " + url, e); - return null; - }); - if (dynamicTokens) return dynamicTokens; + const url = `${getEnv("DYNAMIC_CAL_BASE_URL")}/evm/${ + ethereumLikeInfo?.chainId || 0 + }/erc20.json`; + const dynamicTokens: ERC20Token[] | null = await network({ + method: "GET", + url, + }) + .then(({ data }: { data: ERC20Token[] }) => (data.length ? data : null)) + .catch(e => { + log("error", "EVM Family: Couldn't fetch dynamic CAL tokens from " + url, e); + return null; + }); + if (dynamicTokens) return dynamicTokens; - const tokens = tokensByChainId[ - ethereumLikeInfo?.chainId as keyof typeof tokensByChainId - ] as ERC20Token[]; - if (tokens) return tokens; + const tokens = tokensByChainId[ + ethereumLikeInfo?.chainId as keyof typeof tokensByChainId + ] as ERC20Token[]; + if (tokens) return tokens; - log("warning", `EVM Family: No tokens found in CAL for currency: ${currency.id}`, currency); - return []; - }, - currency => `erc20-tokens-${currency.id}`, - { - ttl: 6 * 60 * 60 * 1000, // 6 hours cache - }, -); + log("warning", `EVM Family: No tokens found in CAL for currency: ${currency.id}`, currency); + return []; + }, + currency => `erc20-tokens-${currency.id}`, + { + ttl: 6 * 60 * 60 * 1000, // 6 hours cache + }, + ); -export async function preload(currency: CryptoCurrency): Promise { +export async function preload(currency: CryptoCurrency): Promise { const erc20 = await fetchERC20Tokens(currency); - // This weird thing is here to help the "clone" currencies like - // ethereum_as_evm_test_only & polygon_as_evm_test_only - // to get tokens despite the different currency_id - // registered in the CAL for those chain ids - // We should remove this after the merge - addTokens(erc20.map(([, ...tokenRest]) => convertERC20([currency.id, ...tokenRest]))); + if (currency.id === "bsc") { + addTokens((erc20 as BEP20Token[]).map(convertBEP20)); + return erc20; + } + addTokens(erc20.map(convertERC20)); return erc20; } -export function hydrate(value: ERC20Token[] | null | undefined): void { +export function hydrate(value: ERC20Token[] | null | undefined, currency: CryptoCurrency): void { if (!Array.isArray(value)) return; + if (currency.id === "bsc") { + addTokens((value as BEP20Token[]).map(convertBEP20)); + log("evm/preload", "hydrate " + value.length + " tokens"); + return; + } addTokens(value.map(convertERC20)); log("evm/preload", "hydrate " + value.length + " tokens"); } diff --git a/libs/coin-evm/src/synchronization.ts b/libs/coin-evm/src/synchronization.ts index cf25e3cee22c..f2dca0aaa261 100644 --- a/libs/coin-evm/src/synchronization.ts +++ b/libs/coin-evm/src/synchronization.ts @@ -87,7 +87,9 @@ export const getAccountShape: GetAccountShape = async infos => { })(); const newSubAccounts = await getSubAccounts(infos, accountId, lastTokenOperations); - const subAccounts = mergeSubAccounts(initialAccount, newSubAccounts); // Merging potential new subAccouns while preserving the references + const subAccounts = shouldSyncFromScratch + ? newSubAccounts + : mergeSubAccounts(initialAccount, newSubAccounts); // Merging potential new subAccouns while preserving the references // Trying to confirm pending operations that we are sure of // because they were made in the live @@ -105,7 +107,10 @@ export const getAccountShape: GetAccountShape = async infos => { lastNftOperations, ); const newOperations = [...confirmedOperations, ...lastCoinOperationsWithAttachements]; - const operations = mergeOps(initialAccount?.operations || [], newOperations); + const operations = + shouldSyncFromScratch || !initialAccount?.operations + ? newOperations + : mergeOps(initialAccount?.operations, newOperations); const operationsWithPendings = mergeOps(operations, initialAccount?.pendingOperations || []); // Merging potential new nfts while preserving the references. diff --git a/libs/coin-framework/CHANGELOG.md b/libs/coin-framework/CHANGELOG.md index a0e8d4e195e4..3d9e2db31b7e 100644 --- a/libs/coin-framework/CHANGELOG.md +++ b/libs/coin-framework/CHANGELOG.md @@ -1,5 +1,37 @@ # @ledgerhq/coin-framework +## 0.8.0 + +### Minor Changes + +- [#5042](https://github.com/LedgerHQ/ledger-live/pull/5042) [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Modify token ids encoding in `TokenAccounts` ids which could contain characters preventing the correct "deserialization" of those ids. + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/cryptoassets@11.0.1 + +## 0.8.0-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + +## 0.8.0-hotfix.1 + +### Minor Changes + +- [#5042](https://github.com/LedgerHQ/ledger-live/pull/5042) [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Modify token ids encoding in `TokenAccounts` ids which could contain characters preventing the correct "deserialization" of those ids. + +## 0.7.1-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/types-live@6.41.1-hotfix.0 + ## 0.7.0 ### Minor Changes diff --git a/libs/coin-framework/package.json b/libs/coin-framework/package.json index 8657fa642c15..cf1bd2270ac0 100644 --- a/libs/coin-framework/package.json +++ b/libs/coin-framework/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/coin-framework", - "version": "0.7.0", + "version": "0.8.0", "description": "Ledger framework for Coin integration", "keywords": [ "Ledger", diff --git a/libs/coin-framework/src/account/accountId.ts b/libs/coin-framework/src/account/accountId.ts index eb954668732f..9606281b4228 100644 --- a/libs/coin-framework/src/account/accountId.ts +++ b/libs/coin-framework/src/account/accountId.ts @@ -11,6 +11,26 @@ function ensureNoColon(value: string, ctx: string): string { return value; } +export function safeEncodeTokenId(tokenId: string): string { + if (!tokenId) return ""; + + const URIEncoded = encodeURIComponent(tokenId); + const dashUnderscoreSafe = URIEncoded.replace(/-/g, "~!dash!~").replace(/_/g, "~!underscore!~"); + + return dashUnderscoreSafe; +} + +export function safeDecodeTokenId(encodedTokenId: string): string { + if (!encodedTokenId) return ""; + + const dashUnderscoreUnsafe = encodedTokenId + .replace(/~!dash!~/g, "-") + .replace(/~!underscore!~/g, "_"); + const decodedURIComponent = decodeURIComponent(dashUnderscoreUnsafe); + + return decodedURIComponent; +} + export function encodeAccountId({ type, version, @@ -27,14 +47,14 @@ export function encodeAccountId({ )}`; } export function encodeTokenAccountId(accountId: string, token: TokenCurrency): string { - return accountId + "+" + encodeURIComponent(token.id); + return accountId + "+" + safeEncodeTokenId(token.id); } export function decodeTokenAccountId(id: string): { accountId: string; token: TokenCurrency | null | undefined; } { const [accountId, tokenId] = id.split("+"); - const decodedTokenId = decodeURIComponent(tokenId); + const decodedTokenId = safeDecodeTokenId(tokenId); let token = findTokenById(decodedTokenId); if (!token) { const { currencyId } = decodeAccountId(accountId); diff --git a/libs/coin-framework/src/account/accountId.unit.test.ts b/libs/coin-framework/src/account/accountId.unit.test.ts new file mode 100644 index 000000000000..be20a70a3559 --- /dev/null +++ b/libs/coin-framework/src/account/accountId.unit.test.ts @@ -0,0 +1,73 @@ +import { + decodeTokenAccountId, + encodeTokenAccountId, + safeDecodeTokenId, + safeEncodeTokenId, +} from "./accountId"; +import { getTokenById } from "../currencies"; + +describe("coin-framework", () => { + describe("accountId", () => { + describe("safeEncodeTokenId", () => { + it("shouldn't throw with falsy tokenId", () => { + expect(safeEncodeTokenId(null as any)).toBe(""); + expect(safeEncodeTokenId(undefined as any)).toBe(""); + expect(safeEncodeTokenId("")).toBe(""); + }); + + it("should encode a token id by making it URI encoded and remove characters used for accountId splitting", () => { + const tokenId = "foo/bar-baz_qux+fred thud0123°?=/&$"; + + expect(safeEncodeTokenId(tokenId)).not.toMatch( + // should match with any character exect those + new RegExp("[^a-z0-9.!~*'()%]", "gi"), + ); + }); + }); + describe("safeDecodeTokenId", () => { + it("shouldn't throw with falsy encodedTokenId", () => { + expect(safeDecodeTokenId(null as any)).toBe(""); + expect(safeDecodeTokenId(undefined as any)).toBe(""); + expect(safeDecodeTokenId("")).toBe(""); + }); + + it("should decode a token id and remove all obfuscation", () => { + const encodedTokenId = + "foo%2Fbar~!dash!~baz~!underscore!~qux%2Bfred%20thud0123456789%C2%B0"; + + expect(safeDecodeTokenId(encodedTokenId)).toBe("foo/bar-baz_qux+fred thud0123456789°"); + }); + }); + + describe("encodeTokenAccountId", () => { + it("should return an URI and splitting safe tokenAccountId (no + - _ % \\ /)", () => { + const accountId = "js:2:0xkvn:"; + const token = getTokenById("bsc/bep20/binance-peg_dai_token"); + + const tokenAccountId = encodeTokenAccountId(accountId, token); + expect(tokenAccountId).toBe( + "js:2:0xkvn:+bsc%2Fbep20%2Fbinance~!dash!~peg~!underscore!~dai~!underscore!~token", + ); + expect(tokenAccountId).not.toMatch( + // should match with any character exect those + new RegExp("[^a-z0-9.!~*'()%:+]", "gi"), + ); + // Should only contain 1 + character + expect(tokenAccountId.split("+").length).toBe(2); + }); + }); + + describe("decodeTokenAccountId", () => { + it("should return an accountId and a token", () => { + expect( + decodeTokenAccountId( + "js:2:0xkvn:+bsc%2Fbep20%2Fbinance~!dash!~peg~!underscore!~dai~!underscore!~token", + ), + ).toEqual({ + accountId: "js:2:0xkvn:", + token: getTokenById("bsc/bep20/binance-peg_dai_token"), + }); + }); + }); + }); +}); diff --git a/libs/coin-polkadot/CHANGELOG.md b/libs/coin-polkadot/CHANGELOG.md index 6989caa1f2c9..e4da5d5c253c 100644 --- a/libs/coin-polkadot/CHANGELOG.md +++ b/libs/coin-polkadot/CHANGELOG.md @@ -1,5 +1,37 @@ # @ledgerhq/coin-polkadot +## 0.4.4 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/cryptoassets@11.0.1 + +## 0.4.4-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + +## 0.4.4-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + +## 0.4.4-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + ## 0.4.3 ### Patch Changes diff --git a/libs/coin-polkadot/package.json b/libs/coin-polkadot/package.json index a315d1c14f9c..a2dbc0f3d8b1 100644 --- a/libs/coin-polkadot/package.json +++ b/libs/coin-polkadot/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/coin-polkadot", - "version": "0.4.3", + "version": "0.4.4", "description": "Ledger Polkadot Coin integration", "keywords": [ "Ledger", diff --git a/libs/domain-service/CHANGELOG.md b/libs/domain-service/CHANGELOG.md index 31aed53d36e9..b7b188c0d8cd 100644 --- a/libs/domain-service/CHANGELOG.md +++ b/libs/domain-service/CHANGELOG.md @@ -1,5 +1,27 @@ # @ledgerhq/domain-service +## 1.1.13 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/cryptoassets@11.0.1 + +## 1.1.13-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + +## 1.1.13-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/types-live@6.41.1-hotfix.0 + ## 1.1.12 ### Patch Changes diff --git a/libs/domain-service/package.json b/libs/domain-service/package.json index bda3c99aacb4..876037907870 100644 --- a/libs/domain-service/package.json +++ b/libs/domain-service/package.json @@ -1,7 +1,7 @@ { "name": "@ledgerhq/domain-service", "description": "Ledger service responsible for domain handling", - "version": "1.1.12", + "version": "1.1.13", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/libs/evm-tools/CHANGELOG.md b/libs/evm-tools/CHANGELOG.md index ff3af3e3d7ee..61c6dfc924bf 100644 --- a/libs/evm-tools/CHANGELOG.md +++ b/libs/evm-tools/CHANGELOG.md @@ -1,5 +1,19 @@ # @ledgerhq/evm-tools +## 1.0.9 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1 + +## 1.0.9-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + ## 1.0.8 ### Patch Changes diff --git a/libs/evm-tools/package.json b/libs/evm-tools/package.json index 24867d300d5d..43cf8a8f81a5 100644 --- a/libs/evm-tools/package.json +++ b/libs/evm-tools/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/evm-tools", - "version": "1.0.8", + "version": "1.0.9", "description": "EVM tooling used for coin integrations & app bindings", "main": "./index.ts", "keywords": [ diff --git a/libs/ledger-live-common/CHANGELOG.md b/libs/ledger-live-common/CHANGELOG.md index 4fad7e66fa0a..adf9d4327c0e 100644 --- a/libs/ledger-live-common/CHANGELOG.md +++ b/libs/ledger-live-common/CHANGELOG.md @@ -1,5 +1,61 @@ # @ledgerhq/live-common +## 33.0.1 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + +- [#5115](https://github.com/LedgerHQ/ledger-live/pull/5115) [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Adds another default case to the usePickDefaultCurrency hook when ETH or BTC are not available in the provided currencies for the swap. + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/coin-evm@0.9.0 + - @ledgerhq/coin-framework@0.8.0 + - @ledgerhq/cryptoassets@11.0.1 + - @ledgerhq/coin-algorand@0.3.4 + - @ledgerhq/coin-polkadot@0.4.4 + - @ledgerhq/domain-service@1.1.13 + - @ledgerhq/hw-app-eth@6.34.8 + +## 33.0.1-hotfix.2 + +### Patch Changes + +- [#5115](https://github.com/LedgerHQ/ledger-live/pull/5115) [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Adds another default case to the usePickDefaultCurrency hook when ETH or BTC are not available in the provided currencies for the swap. + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + - @ledgerhq/coin-algorand@0.3.4-hotfix.2 + - @ledgerhq/coin-evm@0.9.0-hotfix.2 + - @ledgerhq/coin-framework@0.8.0-hotfix.2 + - @ledgerhq/coin-polkadot@0.4.4-hotfix.2 + - @ledgerhq/domain-service@1.1.13-hotfix.1 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.1 + +## 33.0.1-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975), [`3b4f7501cc`](https://github.com/LedgerHQ/ledger-live/commit/3b4f7501cc5f09be94a2994f20f9998898682975)]: + - @ledgerhq/coin-evm@0.9.0-hotfix.1 + - @ledgerhq/coin-framework@0.8.0-hotfix.1 + - @ledgerhq/coin-algorand@0.3.4-hotfix.1 + - @ledgerhq/coin-polkadot@0.4.4-hotfix.1 + +## 33.0.1-hotfix.0 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + +- Updated dependencies []: + - @ledgerhq/coin-algorand@0.3.4-hotfix.0 + - @ledgerhq/coin-evm@0.8.1-hotfix.0 + - @ledgerhq/coin-framework@0.7.1-hotfix.0 + - @ledgerhq/coin-polkadot@0.4.4-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.0 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.0 + ## 33.0.0 ### Major Changes diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json index 9c5663177799..b15db4facb28 100644 --- a/libs/ledger-live-common/package.json +++ b/libs/ledger-live-common/package.json @@ -1,7 +1,7 @@ { "name": "@ledgerhq/live-common", "description": "Common ground for the Ledger Live apps", - "version": "33.0.0", + "version": "33.0.1", "repository": { "type": "git", "url": "https://github.com/LedgerHQ/ledger-live.git" diff --git a/libs/ledger-live-common/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap b/libs/ledger-live-common/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap index ac8cbd708345..c774d7cc8ff6 100644 --- a/libs/ledger-live-common/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +++ b/libs/ledger-live-common/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap @@ -8,7 +8,7 @@ Array [ "ethereum/erc20/usd_tether__erc20_", "bitcoin_cash", "litecoin", - "binance_beacon_chain", + "bsc", "eos", "tezos", "stellar", @@ -1380,7 +1380,6 @@ Array [ "near", "avalanche_c_chain", "banano", - "bsc", "celo", "coreum", "desmos", @@ -1419,6 +1418,7 @@ Array [ "polygon_zk_evm", "base", "klaytn", + "binance_beacon_chain", "ethereum/erc20/$aapl", "ethereum/erc20/$based", "ethereum/erc20/$die", diff --git a/libs/ledger-live-common/src/exchange/swap/hooks/usePickDefaultCurrency.ts b/libs/ledger-live-common/src/exchange/swap/hooks/usePickDefaultCurrency.ts index 4510d27a1f54..b6472ac3100f 100644 --- a/libs/ledger-live-common/src/exchange/swap/hooks/usePickDefaultCurrency.ts +++ b/libs/ledger-live-common/src/exchange/swap/hooks/usePickDefaultCurrency.ts @@ -1,5 +1,6 @@ import type { CryptoOrTokenCurrency } from "@ledgerhq/types-cryptoassets"; import { useEffect } from "react"; +import { currenciesByMarketcap } from "../../../currencies"; // Pick a default currency target if none are selected. export const usePickDefaultCurrency = ( @@ -14,7 +15,14 @@ export const usePickDefaultCurrency = ( const defaultCurrency = currencies.find( currency => currency.id === "ethereum" || currency.id === "bitcoin", ); - defaultCurrency && setCurrency(defaultCurrency); + + if (defaultCurrency) { + setCurrency(defaultCurrency); + } else if (currencies.length > 0) { + currenciesByMarketcap(currencies).then(sortedCurrencies => { + setCurrency(sortedCurrencies[0]); + }); + } } }, [currency, currencies, setCurrency]); }; diff --git a/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts b/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts index fc9b25c93a62..ea47b0600924 100644 --- a/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts +++ b/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts @@ -280,18 +280,27 @@ export const DEFAULT_FEATURES: Features = { enabled: false, params: { deeplink: "", - login: { - loginURI: "ledgerlive://recover/protect-simu?redirectTo=login", + account: { + homeURI: + "ledgerlive://recover/protect-simu?redirectTo=account&source=llm-myledger-access-card&ajs_prop_source=llm-myledger-access-card&ajs_prop_campaign=recover-launch", + loginURI: + "ledgerlive://recover/protect-simu?redirectTo=login&source=llm-myledger-access-card&ajs_prop_source=llm-myledger-access-card&ajs_prop_campaign=recover-launch", }, managerStatesData: { NEW: { - alreadySubscribedURI: `ledgerlive://recover/protect-simu?redirectTo=login&source=llm_onboarding_24&ajs_prop_source=llm_onboarding_24&ajs_prop_campaign=launch`, - learnMoreURI: `ledgerlive://recover/protect-simu?redirectTo=upsell&source=llm_onboarding_24&ajs_prop_source=llm_onboarding_24&ajs_prop_campaign=launch`, - quickAccessURI: `ledgerlive://recover/protect-simu?redirectTo=login&source=llm-navbar-quick-access&ajs_prop_source=llm-navbar-quick-access&ajs_prop_campaign=launch`, + learnMoreURI: + "ledgerlive://recover/protect-simu?redirectTo=upsell&source=llm-onboarding-24&ajs_prop_source=llm-onboarding-24&ajs_prop_campaign=recover-launch", + alreadySubscribedURI: + "ledgerlive://recover/protect-simu?redirectTo=login&source=llm-onboarding-24&ajs_prop_source=llm-onboarding-24&ajs_prop_campaign=recover-launch", + quickAccessURI: + "ledgerlive://recover/protect-simu?redirectTo=upsell&source=llm-navbar-quick-access&ajs_prop_source=llm-navbar-quick-access&ajs_prop_campaign=recover-launch", + alreadyOnboardedURI: + "ledgerlive://recover/protect-simu?redirectTo=upsell&source=llm-pairing&ajs_prop_source=llm-pairing&ajs_prop_campaign=recover-launch", }, }, onboardingRestore: { - postOnboardingURI: `ledgerlive://recover/protect-simu?redirectTo=restore`, + postOnboardingURI: + "ledgerlive://recover/protect-simu?redirectTo=restore&source=llm-restore-24&ajs_prop_source=llm-restore-24&ajs_prop_campaign=recover-launch", restoreInfoDrawer: { enabled: true, manualStepsURI: diff --git a/libs/ledger-live-common/src/hooks/recoverFeatureFlag.ts b/libs/ledger-live-common/src/hooks/recoverFeatureFlag.ts index ae274022589a..525dcbb16809 100644 --- a/libs/ledger-live-common/src/hooks/recoverFeatureFlag.ts +++ b/libs/ledger-live-common/src/hooks/recoverFeatureFlag.ts @@ -52,6 +52,15 @@ export function useQuickAccessURI( return useReplacedURI(uri, id); } +export function useAlreadyOnboardedURI( + servicesConfig: Feature_ProtectServicesMobile | null, +): string | undefined { + const uri = servicesConfig?.params?.managerStatesData?.NEW?.alreadyOnboardedURI; + const id = servicesConfig?.params?.protectId; + + return useReplacedURI(uri, id); +} + export function useAlreadySubscribedURI( servicesConfig: Feature_ProtectServicesMobile | null, ): string | undefined { @@ -61,6 +70,15 @@ export function useAlreadySubscribedURI( return useReplacedURI(uri, id); } +export function useHomeURI( + servicesConfig: Feature_ProtectServicesMobile | null, +): string | undefined { + const uri = servicesConfig?.params?.account?.homeURI; + const id = servicesConfig?.params?.protectId; + + return useReplacedURI(uri, id); +} + export function useUpsellURI( servicesConfig: Feature_ProtectServicesDesktop | null, ): string | undefined { @@ -79,7 +97,7 @@ export function useUpsellPath( } export function useLoginURI( - servicesConfig: Feature_ProtectServicesDesktop | null, + servicesConfig: Feature_ProtectServicesMobile | Feature_ProtectServicesDesktop | null, ): string | undefined { const uri = servicesConfig?.params?.account?.loginURI; const id = servicesConfig?.params?.protectId; diff --git a/libs/ledgerjs/CHANGELOG.md b/libs/ledgerjs/CHANGELOG.md index a2f9dc7df126..f6e3b12b625c 100644 --- a/libs/ledgerjs/CHANGELOG.md +++ b/libs/ledgerjs/CHANGELOG.md @@ -1,5 +1,17 @@ # ledger-libs +## 0.1.2 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + +## 0.1.2-hotfix.0 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + ## 0.1.1 ### Patch Changes diff --git a/libs/ledgerjs/package.json b/libs/ledgerjs/package.json index d29e0b6066b4..e7389039f5c2 100644 --- a/libs/ledgerjs/package.json +++ b/libs/ledgerjs/package.json @@ -1,7 +1,7 @@ { "name": "ledger-libs", "private": true, - "version": "0.1.1", + "version": "0.1.2", "scripts": { "test:importer": "jest script/crypto-assets-importer/", "import-cal-tokens": "ts-node script/crypto-assets-importer/index.ts" diff --git a/libs/ledgerjs/packages/cryptoassets/CHANGELOG.md b/libs/ledgerjs/packages/cryptoassets/CHANGELOG.md index 456ee36194a9..0ceb67503630 100644 --- a/libs/ledgerjs/packages/cryptoassets/CHANGELOG.md +++ b/libs/ledgerjs/packages/cryptoassets/CHANGELOG.md @@ -1,5 +1,17 @@ # @ledgerhq/cryptoassets +## 11.0.1 + +### Patch Changes + +- [#5115](https://github.com/LedgerHQ/ledger-live/pull/5115) [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Reordering bsc & binance_beacon_chain to avoid errors while sorting by market cap due to token collision + +## 11.0.1-hotfix.0 + +### Patch Changes + +- [#5115](https://github.com/LedgerHQ/ledger-live/pull/5115) [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Reordering bsc & binance_beacon_chain to avoid errors while sorting by market cap due to token collision + ## 11.0.0 ### Major Changes diff --git a/libs/ledgerjs/packages/cryptoassets/package.json b/libs/ledgerjs/packages/cryptoassets/package.json index 85f01253c4b2..f28004d1271e 100644 --- a/libs/ledgerjs/packages/cryptoassets/package.json +++ b/libs/ledgerjs/packages/cryptoassets/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/cryptoassets", - "version": "11.0.0", + "version": "11.0.1", "description": "Ledger crypto-assets list", "keywords": [ "Ledger" diff --git a/libs/ledgerjs/packages/cryptoassets/src/currencies.ts b/libs/ledgerjs/packages/cryptoassets/src/currencies.ts index 4351d99eff80..3e34e179134c 100644 --- a/libs/ledgerjs/packages/cryptoassets/src/currencies.ts +++ b/libs/ledgerjs/packages/cryptoassets/src/currencies.ts @@ -327,35 +327,6 @@ export const cryptocurrenciesById: Record = { ], explorerViews: [], }, - binance_beacon_chain: { - type: "CryptoCurrency", - id: "binance_beacon_chain", - coinType: CoinType.ATOM, - name: "BinanceBeaconChain", - managerAppName: "Cosmos", - ticker: "BNB", - scheme: "BinanceBeaconChain", - color: "#f0b90b", - family: "cosmos", - units: [ - { - name: "BNB", - code: "BNB", - magnitude: 6, - }, - { - name: "Micro-BNB", - code: "ubnb", - magnitude: 0, - }, - ], - explorerViews: [ - { - tx: "https://binance.mintscan.io/txs/$hash", - address: "https://binance.mintscan.io/validators/$address", - }, - ], - }, bitcoin: { type: "CryptoCurrency", id: "bitcoin", @@ -4371,6 +4342,37 @@ export const cryptocurrenciesById: Record = { }, ], }, + // Keep it at the bottom + // Tickers dup + binance_beacon_chain: { + type: "CryptoCurrency", + id: "binance_beacon_chain", + coinType: CoinType.ATOM, + name: "BinanceBeaconChain", + managerAppName: "Cosmos", + ticker: "BNB", + scheme: "BinanceBeaconChain", + color: "#f0b90b", + family: "cosmos", + units: [ + { + name: "BNB", + code: "BNB", + magnitude: 6, + }, + { + name: "Micro-BNB", + code: "ubnb", + magnitude: 0, + }, + ], + explorerViews: [ + { + tx: "https://binance.mintscan.io/txs/$hash", + address: "https://binance.mintscan.io/validators/$address", + }, + ], + }, }; const cryptocurrenciesByScheme: Record = {}; diff --git a/libs/ledgerjs/packages/cryptoassets/src/tokens.ts b/libs/ledgerjs/packages/cryptoassets/src/tokens.ts index 989feaa51754..59892c61838e 100644 --- a/libs/ledgerjs/packages/cryptoassets/src/tokens.ts +++ b/libs/ledgerjs/packages/cryptoassets/src/tokens.ts @@ -262,7 +262,7 @@ export function convertERC20([ }; } -function convertBEP20([ +export function convertBEP20([ parentCurrencyId, token, ticker, diff --git a/libs/ledgerjs/packages/hw-app-eth/CHANGELOG.md b/libs/ledgerjs/packages/hw-app-eth/CHANGELOG.md index 1f1d28922740..d00998cfa9c7 100644 --- a/libs/ledgerjs/packages/hw-app-eth/CHANGELOG.md +++ b/libs/ledgerjs/packages/hw-app-eth/CHANGELOG.md @@ -1,5 +1,33 @@ # @ledgerhq/hw-app-eth +## 6.34.8 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/types-live@6.41.1 + - @ledgerhq/cryptoassets@11.0.1 + - @ledgerhq/domain-service@1.1.13 + - @ledgerhq/evm-tools@1.0.9 + +## 6.34.8-hotfix.1 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/cryptoassets@11.0.1-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.1 + - @ledgerhq/evm-tools@1.0.9-hotfix.0 + +## 6.34.8-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/types-live@6.41.1-hotfix.0 + - @ledgerhq/domain-service@1.1.13-hotfix.0 + - @ledgerhq/evm-tools@1.0.8 + ## 6.34.7 ### Patch Changes diff --git a/libs/ledgerjs/packages/hw-app-eth/package.json b/libs/ledgerjs/packages/hw-app-eth/package.json index f171462876cc..fcd66e552e99 100644 --- a/libs/ledgerjs/packages/hw-app-eth/package.json +++ b/libs/ledgerjs/packages/hw-app-eth/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/hw-app-eth", - "version": "6.34.7", + "version": "6.34.8", "description": "Ledger Hardware Wallet Ethereum Application API", "keywords": [ "Ledger", diff --git a/libs/ledgerjs/packages/swift-bridge-hw-app-eth/CHANGELOG.md b/libs/ledgerjs/packages/swift-bridge-hw-app-eth/CHANGELOG.md index a75a080dc062..6645723db5e7 100644 --- a/libs/ledgerjs/packages/swift-bridge-hw-app-eth/CHANGELOG.md +++ b/libs/ledgerjs/packages/swift-bridge-hw-app-eth/CHANGELOG.md @@ -1,5 +1,26 @@ # @ledgerhq/swift-bridge-hw-app-eth +## 1.0.19 + +### Patch Changes + +- Updated dependencies []: + - @ledgerhq/hw-app-eth@6.34.8 + +## 1.0.19-hotfix.1 + +### Patch Changes + +- Updated dependencies []: + - @ledgerhq/hw-app-eth@6.34.8-hotfix.1 + +## 1.0.19-hotfix.0 + +### Patch Changes + +- Updated dependencies []: + - @ledgerhq/hw-app-eth@6.34.8-hotfix.0 + ## 1.0.18 ### Patch Changes diff --git a/libs/ledgerjs/packages/swift-bridge-hw-app-eth/package.json b/libs/ledgerjs/packages/swift-bridge-hw-app-eth/package.json index d06937aa0d57..f4095ddc321a 100644 --- a/libs/ledgerjs/packages/swift-bridge-hw-app-eth/package.json +++ b/libs/ledgerjs/packages/swift-bridge-hw-app-eth/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/swift-bridge-hw-app-eth", - "version": "1.0.18", + "version": "1.0.19", "description": "Package to facilitate bundling hw-app-eth in the EthWrapper Swift package", "keywords": [ "Ledger", diff --git a/libs/ledgerjs/packages/types-live/CHANGELOG.md b/libs/ledgerjs/packages/types-live/CHANGELOG.md index 625e1bb54b35..014ee2ee4168 100644 --- a/libs/ledgerjs/packages/types-live/CHANGELOG.md +++ b/libs/ledgerjs/packages/types-live/CHANGELOG.md @@ -1,5 +1,17 @@ # @ledgerhq/types-live +## 6.41.1 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + +## 6.41.1-hotfix.0 + +### Patch Changes + +- [#4895](https://github.com/LedgerHQ/ledger-live/pull/4895) [`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb) Thanks [@stephane-lieumont-ledger](https://github.com/stephane-lieumont-ledger)! - feat(protect-2592): add other link on firebase for quick access recover + ## 6.41.0 ### Minor Changes diff --git a/libs/ledgerjs/packages/types-live/package.json b/libs/ledgerjs/packages/types-live/package.json index e0c775b1c3d8..7d8eb3c58ae4 100644 --- a/libs/ledgerjs/packages/types-live/package.json +++ b/libs/ledgerjs/packages/types-live/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/types-live", - "version": "6.41.0", + "version": "6.41.1", "description": "Ledger Live main types.", "keywords": [ "Ledger" diff --git a/libs/ledgerjs/packages/types-live/src/feature.ts b/libs/ledgerjs/packages/types-live/src/feature.ts index 19aa7b9492dd..6cffab4ec0dc 100644 --- a/libs/ledgerjs/packages/types-live/src/feature.ts +++ b/libs/ledgerjs/packages/types-live/src/feature.ts @@ -311,10 +311,12 @@ export type Feature_ProtectServicesMobile = Feature<{ learnMoreURI: string; alreadySubscribedURI: string; quickAccessURI: string; + alreadyOnboardedURI: string; }; }; - login: { + account: { loginURI: string; + homeURI: string; }; protectId: string; }>; diff --git a/libs/test-utils/CHANGELOG.md b/libs/test-utils/CHANGELOG.md index 5114c9c1f854..a7e7fb76a1c2 100644 --- a/libs/test-utils/CHANGELOG.md +++ b/libs/test-utils/CHANGELOG.md @@ -1,5 +1,33 @@ # @ledgerhq/test-utils +## 0.0.8 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1 + +## 0.0.8-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1-hotfix.2 + +## 0.0.8-hotfix.1 + +### Patch Changes + +- Updated dependencies []: + - @ledgerhq/live-common@33.0.1-hotfix.1 + +## 0.0.8-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/live-common@33.0.1-hotfix.0 + ## 0.0.7 ### Patch Changes diff --git a/libs/test-utils/package.json b/libs/test-utils/package.json index aeb03db6a99c..da99175f9b30 100644 --- a/libs/test-utils/package.json +++ b/libs/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/test-utils", - "version": "0.0.7", + "version": "0.0.8", "private": true, "description": "Dummy apps and utils for tests", "keywords": [ diff --git a/tests/dummy-wallet-app/CHANGELOG.md b/tests/dummy-wallet-app/CHANGELOG.md index a5667e72c3fc..d8a4385cc772 100644 --- a/tests/dummy-wallet-app/CHANGELOG.md +++ b/tests/dummy-wallet-app/CHANGELOG.md @@ -1,5 +1,36 @@ # dummy-wallet-app +## 0.1.25 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb), [`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1 + - @ledgerhq/hw-app-eth@6.34.8 + +## 0.1.25-hotfix.2 + +### Patch Changes + +- Updated dependencies [[`fbeebfe04b`](https://github.com/LedgerHQ/ledger-live/commit/fbeebfe04b297b33ec258440b694cdfb6213af24)]: + - @ledgerhq/live-common@33.0.1-hotfix.2 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.1 + +## 0.1.25-hotfix.1 + +### Patch Changes + +- Updated dependencies []: + - @ledgerhq/live-common@33.0.1-hotfix.1 + +## 0.1.25-hotfix.0 + +### Patch Changes + +- Updated dependencies [[`ce18546c0a`](https://github.com/LedgerHQ/ledger-live/commit/ce18546c0a0b9dd5ed78b1745cac19b7eef7b5eb)]: + - @ledgerhq/live-common@33.0.1-hotfix.0 + - @ledgerhq/hw-app-eth@6.34.8-hotfix.0 + ## 0.1.24 ### Patch Changes diff --git a/tests/dummy-wallet-app/package.json b/tests/dummy-wallet-app/package.json index 9f00d9652993..323e444e4b16 100644 --- a/tests/dummy-wallet-app/package.json +++ b/tests/dummy-wallet-app/package.json @@ -1,6 +1,6 @@ { "name": "dummy-wallet-app", - "version": "0.1.24", + "version": "0.1.25", "private": true, "dependencies": { "@ledgerhq/hw-app-eth": "workspace:*", diff --git a/tools/actions/get-workflow-artifacts-id/build/main.js b/tools/actions/get-workflow-artifacts-id/build/main.js index 8f2092076464..b9faca39e004 100644 --- a/tools/actions/get-workflow-artifacts-id/build/main.js +++ b/tools/actions/get-workflow-artifacts-id/build/main.js @@ -18583,6 +18583,839 @@ var require_lib2 = __commonJS({ } }); +// ../../../node_modules/.pnpm/@actions+http-client@2.0.1/node_modules/@actions/http-client/lib/auth.js +var require_auth = __commonJS({ + "../../../node_modules/.pnpm/@actions+http-client@2.0.1/node_modules/@actions/http-client/lib/auth.js"(exports) { + "use strict"; + var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; + var BasicCredentialHandler = class { + constructor(username, password) { + this.username = username; + this.password = password; + } + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("not implemented"); + }); + } + }; + exports.BasicCredentialHandler = BasicCredentialHandler; + var BearerCredentialHandler = class { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Bearer ${this.token}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("not implemented"); + }); + } + }; + exports.BearerCredentialHandler = BearerCredentialHandler; + var PersonalAccessTokenCredentialHandler = class { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("not implemented"); + }); + } + }; + exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; + } +}); + +// ../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/oidc-utils.js +var require_oidc_utils = __commonJS({ + "../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/oidc-utils.js"(exports) { + "use strict"; + var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.OidcClient = void 0; + var http_client_1 = require_lib(); + var auth_1 = require_auth(); + var core_1 = require_core(); + var OidcClient = class _OidcClient { + static createHttpClient(allowRetry = true, maxRetry = 10) { + const requestOptions = { + allowRetries: allowRetry, + maxRetries: maxRetry + }; + return new http_client_1.HttpClient("actions/oidc-client", [new auth_1.BearerCredentialHandler(_OidcClient.getRequestToken())], requestOptions); + } + static getRequestToken() { + const token = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]; + if (!token) { + throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable"); + } + return token; + } + static getIDTokenUrl() { + const runtimeUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]; + if (!runtimeUrl) { + throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable"); + } + return runtimeUrl; + } + static getCall(id_token_url) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const httpclient = _OidcClient.createHttpClient(); + const res = yield httpclient.getJson(id_token_url).catch((error) => { + throw new Error(`Failed to get ID Token. + + Error Code : ${error.statusCode} + + Error Message: ${error.message}`); + }); + const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; + if (!id_token) { + throw new Error("Response json body do not have ID Token field"); + } + return id_token; + }); + } + static getIDToken(audience) { + return __awaiter(this, void 0, void 0, function* () { + try { + let id_token_url = _OidcClient.getIDTokenUrl(); + if (audience) { + const encodedAudience = encodeURIComponent(audience); + id_token_url = `${id_token_url}&audience=${encodedAudience}`; + } + core_1.debug(`ID token url is ${id_token_url}`); + const id_token = yield _OidcClient.getCall(id_token_url); + core_1.setSecret(id_token); + return id_token; + } catch (error) { + throw new Error(`Error message: ${error.message}`); + } + }); + } + }; + exports.OidcClient = OidcClient; + } +}); + +// ../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/summary.js +var require_summary = __commonJS({ + "../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/summary.js"(exports) { + "use strict"; + var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; + var os_1 = require("os"); + var fs_1 = require("fs"); + var { access, appendFile, writeFile } = fs_1.promises; + exports.SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY"; + exports.SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary"; + var Summary = class { + constructor() { + this._buffer = ""; + } + /** + * Finds the summary file path from the environment, rejects if env var is not found or file does not exist + * Also checks r/w permissions. + * + * @returns step summary file path + */ + filePath() { + return __awaiter(this, void 0, void 0, function* () { + if (this._filePath) { + return this._filePath; + } + const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; + if (!pathFromEnv) { + throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + } + try { + yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); + } catch (_a) { + throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + } + this._filePath = pathFromEnv; + return this._filePath; + }); + } + /** + * Wraps content in an HTML tag, adding any HTML attributes + * + * @param {string} tag HTML tag to wrap + * @param {string | null} content content within the tag + * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add + * + * @returns {string} content wrapped in HTML element + */ + wrap(tag, content, attrs = {}) { + const htmlAttrs = Object.entries(attrs).map(([key, value]) => ` ${key}="${value}"`).join(""); + if (!content) { + return `<${tag}${htmlAttrs}>`; + } + return `<${tag}${htmlAttrs}>${content}`; + } + /** + * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. + * + * @param {SummaryWriteOptions} [options] (optional) options for write operation + * + * @returns {Promise} summary instance + */ + write(options) { + return __awaiter(this, void 0, void 0, function* () { + const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); + const filePath = yield this.filePath(); + const writeFunc = overwrite ? writeFile : appendFile; + yield writeFunc(filePath, this._buffer, { encoding: "utf8" }); + return this.emptyBuffer(); + }); + } + /** + * Clears the summary buffer and wipes the summary file + * + * @returns {Summary} summary instance + */ + clear() { + return __awaiter(this, void 0, void 0, function* () { + return this.emptyBuffer().write({ overwrite: true }); + }); + } + /** + * Returns the current summary buffer as a string + * + * @returns {string} string of summary buffer + */ + stringify() { + return this._buffer; + } + /** + * If the summary buffer is empty + * + * @returns {boolen} true if the buffer is empty + */ + isEmptyBuffer() { + return this._buffer.length === 0; + } + /** + * Resets the summary buffer without writing to summary file + * + * @returns {Summary} summary instance + */ + emptyBuffer() { + this._buffer = ""; + return this; + } + /** + * Adds raw text to the summary buffer + * + * @param {string} text content to add + * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) + * + * @returns {Summary} summary instance + */ + addRaw(text, addEOL = false) { + this._buffer += text; + return addEOL ? this.addEOL() : this; + } + /** + * Adds the operating system-specific end-of-line marker to the buffer + * + * @returns {Summary} summary instance + */ + addEOL() { + return this.addRaw(os_1.EOL); + } + /** + * Adds an HTML codeblock to the summary buffer + * + * @param {string} code content to render within fenced code block + * @param {string} lang (optional) language to syntax highlight code + * + * @returns {Summary} summary instance + */ + addCodeBlock(code, lang) { + const attrs = Object.assign({}, lang && { lang }); + const element = this.wrap("pre", this.wrap("code", code), attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML list to the summary buffer + * + * @param {string[]} items list of items to render + * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) + * + * @returns {Summary} summary instance + */ + addList(items, ordered = false) { + const tag = ordered ? "ol" : "ul"; + const listItems = items.map((item) => this.wrap("li", item)).join(""); + const element = this.wrap(tag, listItems); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML table to the summary buffer + * + * @param {SummaryTableCell[]} rows table rows + * + * @returns {Summary} summary instance + */ + addTable(rows) { + const tableBody = rows.map((row) => { + const cells = row.map((cell) => { + if (typeof cell === "string") { + return this.wrap("td", cell); + } + const { header, data, colspan, rowspan } = cell; + const tag = header ? "th" : "td"; + const attrs = Object.assign(Object.assign({}, colspan && { colspan }), rowspan && { rowspan }); + return this.wrap(tag, data, attrs); + }).join(""); + return this.wrap("tr", cells); + }).join(""); + const element = this.wrap("table", tableBody); + return this.addRaw(element).addEOL(); + } + /** + * Adds a collapsable HTML details element to the summary buffer + * + * @param {string} label text for the closed state + * @param {string} content collapsable content + * + * @returns {Summary} summary instance + */ + addDetails(label, content) { + const element = this.wrap("details", this.wrap("summary", label) + content); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML image tag to the summary buffer + * + * @param {string} src path to the image you to embed + * @param {string} alt text description of the image + * @param {SummaryImageOptions} options (optional) addition image attributes + * + * @returns {Summary} summary instance + */ + addImage(src, alt, options) { + const { width, height } = options || {}; + const attrs = Object.assign(Object.assign({}, width && { width }), height && { height }); + const element = this.wrap("img", null, Object.assign({ src, alt }, attrs)); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML section heading element + * + * @param {string} text heading text + * @param {number | string} [level=1] (optional) the heading level, default: 1 + * + * @returns {Summary} summary instance + */ + addHeading(text, level) { + const tag = `h${level}`; + const allowedTag = ["h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "h1"; + const element = this.wrap(allowedTag, text); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML thematic break (
) to the summary buffer + * + * @returns {Summary} summary instance + */ + addSeparator() { + const element = this.wrap("hr", null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML line break (
) to the summary buffer + * + * @returns {Summary} summary instance + */ + addBreak() { + const element = this.wrap("br", null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML blockquote to the summary buffer + * + * @param {string} text quote text + * @param {string} cite (optional) citation url + * + * @returns {Summary} summary instance + */ + addQuote(text, cite) { + const attrs = Object.assign({}, cite && { cite }); + const element = this.wrap("blockquote", text, attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML anchor tag to the summary buffer + * + * @param {string} text link text/content + * @param {string} href hyperlink + * + * @returns {Summary} summary instance + */ + addLink(text, href) { + const element = this.wrap("a", text, { href }); + return this.addRaw(element).addEOL(); + } + }; + var _summary = new Summary(); + exports.markdownSummary = _summary; + exports.summary = _summary; + } +}); + +// ../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/path-utils.js +var require_path_utils = __commonJS({ + "../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/path-utils.js"(exports) { + "use strict"; + var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; + var path = __importStar(require("path")); + function toPosixPath(pth) { + return pth.replace(/[\\]/g, "/"); + } + exports.toPosixPath = toPosixPath; + function toWin32Path(pth) { + return pth.replace(/[/]/g, "\\"); + } + exports.toWin32Path = toWin32Path; + function toPlatformPath(pth) { + return pth.replace(/[/\\]/g, path.sep); + } + exports.toPlatformPath = toPlatformPath; + } +}); + +// ../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/core.js +var require_core = __commonJS({ + "../../../node_modules/.pnpm/@actions+core@1.10.1/node_modules/@actions/core/lib/core.js"(exports) { + "use strict"; + var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; + var command_1 = require_command(); + var file_command_1 = require_file_command(); + var utils_1 = require_utils(); + var os = __importStar(require("os")); + var path = __importStar(require("path")); + var oidc_utils_1 = require_oidc_utils(); + var ExitCode; + (function(ExitCode2) { + ExitCode2[ExitCode2["Success"] = 0] = "Success"; + ExitCode2[ExitCode2["Failure"] = 1] = "Failure"; + })(ExitCode = exports.ExitCode || (exports.ExitCode = {})); + function exportVariable(name, val) { + const convertedVal = utils_1.toCommandValue(val); + process.env[name] = convertedVal; + const filePath = process.env["GITHUB_ENV"] || ""; + if (filePath) { + return file_command_1.issueFileCommand("ENV", file_command_1.prepareKeyValueMessage(name, val)); + } + command_1.issueCommand("set-env", { name }, convertedVal); + } + exports.exportVariable = exportVariable; + function setSecret(secret) { + command_1.issueCommand("add-mask", {}, secret); + } + exports.setSecret = setSecret; + function addPath(inputPath) { + const filePath = process.env["GITHUB_PATH"] || ""; + if (filePath) { + file_command_1.issueFileCommand("PATH", inputPath); + } else { + command_1.issueCommand("add-path", {}, inputPath); + } + process.env["PATH"] = `${inputPath}${path.delimiter}${process.env["PATH"]}`; + } + exports.addPath = addPath; + function getInput2(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val; + } + return val.trim(); + } + exports.getInput = getInput2; + function getMultilineInput(name, options) { + const inputs = getInput2(name, options).split("\n").filter((x) => x !== ""); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map((input) => input.trim()); + } + exports.getMultilineInput = getMultilineInput; + function getBooleanInput2(name, options) { + const trueValue = ["true", "True", "TRUE"]; + const falseValue = ["false", "False", "FALSE"]; + const val = getInput2(name, options); + if (trueValue.includes(val)) + return true; + if (falseValue.includes(val)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name} +Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); + } + exports.getBooleanInput = getBooleanInput2; + function setOutput2(name, value) { + const filePath = process.env["GITHUB_OUTPUT"] || ""; + if (filePath) { + return file_command_1.issueFileCommand("OUTPUT", file_command_1.prepareKeyValueMessage(name, value)); + } + process.stdout.write(os.EOL); + command_1.issueCommand("set-output", { name }, utils_1.toCommandValue(value)); + } + exports.setOutput = setOutput2; + function setCommandEcho(enabled) { + command_1.issue("echo", enabled ? "on" : "off"); + } + exports.setCommandEcho = setCommandEcho; + function setFailed2(message) { + process.exitCode = ExitCode.Failure; + error(message); + } + exports.setFailed = setFailed2; + function isDebug() { + return process.env["RUNNER_DEBUG"] === "1"; + } + exports.isDebug = isDebug; + function debug(message) { + command_1.issueCommand("debug", {}, message); + } + exports.debug = debug; + function error(message, properties = {}) { + command_1.issueCommand("error", utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); + } + exports.error = error; + function warning(message, properties = {}) { + command_1.issueCommand("warning", utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); + } + exports.warning = warning; + function notice(message, properties = {}) { + command_1.issueCommand("notice", utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); + } + exports.notice = notice; + function info2(message) { + process.stdout.write(message + os.EOL); + } + exports.info = info2; + function startGroup(name) { + command_1.issue("group", name); + } + exports.startGroup = startGroup; + function endGroup() { + command_1.issue("endgroup"); + } + exports.endGroup = endGroup; + function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } finally { + endGroup(); + } + return result; + }); + } + exports.group = group; + function saveState(name, value) { + const filePath = process.env["GITHUB_STATE"] || ""; + if (filePath) { + return file_command_1.issueFileCommand("STATE", file_command_1.prepareKeyValueMessage(name, value)); + } + command_1.issueCommand("save-state", { name }, utils_1.toCommandValue(value)); + } + exports.saveState = saveState; + function getState(name) { + return process.env[`STATE_${name}`] || ""; + } + exports.getState = getState; + function getIDToken(aud) { + return __awaiter(this, void 0, void 0, function* () { + return yield oidc_utils_1.OidcClient.getIDToken(aud); + }); + } + exports.getIDToken = getIDToken; + var summary_1 = require_summary(); + Object.defineProperty(exports, "summary", { enumerable: true, get: function() { + return summary_1.summary; + } }); + var summary_2 = require_summary(); + Object.defineProperty(exports, "markdownSummary", { enumerable: true, get: function() { + return summary_2.markdownSummary; + } }); + var path_utils_1 = require_path_utils(); + Object.defineProperty(exports, "toPosixPath", { enumerable: true, get: function() { + return path_utils_1.toPosixPath; + } }); + Object.defineProperty(exports, "toWin32Path", { enumerable: true, get: function() { + return path_utils_1.toWin32Path; + } }); + Object.defineProperty(exports, "toPlatformPath", { enumerable: true, get: function() { + return path_utils_1.toPlatformPath; + } }); + } +}); + +// ../../../node_modules/.pnpm/@actions+github@5.1.1/node_modules/@actions/github/lib/context.js +var require_context = __commonJS({ + "../../../node_modules/.pnpm/@actions+github@5.1.1/node_modules/@actions/github/lib/context.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.Context = void 0; + var fs_1 = require("fs"); + var os_1 = require("os"); + var Context = class { + /** + * Hydrate the context from the environment + */ + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: "utf8" })); + } else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } + }; + exports.Context = Context; + } +}); + // ../../../node_modules/.pnpm/@actions+github@5.1.1/node_modules/@actions/github/lib/internal/utils.js var require_utils3 = __commonJS({ "../../../node_modules/.pnpm/@actions+github@5.1.1/node_modules/@actions/github/lib/internal/utils.js"(exports) { diff --git a/tools/actions/turborepo-gh-cache/build/server.js b/tools/actions/turborepo-gh-cache/build/server.js index 9b5894514ded..065102e8f136 100644 --- a/tools/actions/turborepo-gh-cache/build/server.js +++ b/tools/actions/turborepo-gh-cache/build/server.js @@ -89560,6 +89560,20 @@ var require_has_symbols = __commonJS({ } }); +// ../../../node_modules/.pnpm/has-proto@1.0.1/node_modules/has-proto/index.js +var require_has_proto = __commonJS({ + "../../../node_modules/.pnpm/has-proto@1.0.1/node_modules/has-proto/index.js"(exports, module2) { + "use strict"; + var test = { + foo: {} + }; + var $Object = Object; + module2.exports = function hasProto() { + return { __proto__: test }.foo === test.foo && !({ __proto__: null } instanceof $Object); + }; + } +}); + // ../../../node_modules/.pnpm/function-bind@1.1.1/node_modules/function-bind/implementation.js var require_implementation = __commonJS({ "../../../node_modules/.pnpm/function-bind@1.1.1/node_modules/function-bind/implementation.js"(exports, module2) { @@ -89628,9 +89642,9 @@ var require_src2 = __commonJS({ } }); -// ../../../node_modules/.pnpm/get-intrinsic@1.2.0/node_modules/get-intrinsic/index.js +// ../../../node_modules/.pnpm/get-intrinsic@1.2.1/node_modules/get-intrinsic/index.js var require_get_intrinsic = __commonJS({ - "../../../node_modules/.pnpm/get-intrinsic@1.2.0/node_modules/get-intrinsic/index.js"(exports, module2) { + "../../../node_modules/.pnpm/get-intrinsic@1.2.1/node_modules/get-intrinsic/index.js"(exports, module2) { "use strict"; var undefined2; var $SyntaxError = SyntaxError; @@ -89666,16 +89680,17 @@ var require_get_intrinsic = __commonJS({ } }() : throwTypeError; var hasSymbols = require_has_symbols()(); - var getProto = Object.getPrototypeOf || function(x) { + var hasProto = require_has_proto()(); + var getProto = Object.getPrototypeOf || (hasProto ? function(x) { return x.__proto__; - }; + } : null); var needsEval = {}; - var TypedArray = typeof Uint8Array === "undefined" ? undefined2 : getProto(Uint8Array); + var TypedArray = typeof Uint8Array === "undefined" || !getProto ? undefined2 : getProto(Uint8Array); var INTRINSICS = { "%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError, "%Array%": Array, "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer, - "%ArrayIteratorPrototype%": hasSymbols ? getProto([][Symbol.iterator]()) : undefined2, + "%ArrayIteratorPrototype%": hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined2, "%AsyncFromSyncIteratorPrototype%": undefined2, "%AsyncFunction%": needsEval, "%AsyncGenerator%": needsEval, @@ -89706,10 +89721,10 @@ var require_get_intrinsic = __commonJS({ "%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array, "%isFinite%": isFinite, "%isNaN%": isNaN, - "%IteratorPrototype%": hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined2, + "%IteratorPrototype%": hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined2, "%JSON%": typeof JSON === "object" ? JSON : undefined2, "%Map%": typeof Map === "undefined" ? undefined2 : Map, - "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols ? undefined2 : getProto((/* @__PURE__ */ new Map())[Symbol.iterator]()), + "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Map())[Symbol.iterator]()), "%Math%": Math, "%Number%": Number, "%Object%": Object, @@ -89722,10 +89737,10 @@ var require_get_intrinsic = __commonJS({ "%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect, "%RegExp%": RegExp, "%Set%": typeof Set === "undefined" ? undefined2 : Set, - "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols ? undefined2 : getProto((/* @__PURE__ */ new Set())[Symbol.iterator]()), + "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Set())[Symbol.iterator]()), "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer, "%String%": String, - "%StringIteratorPrototype%": hasSymbols ? getProto(""[Symbol.iterator]()) : undefined2, + "%StringIteratorPrototype%": hasSymbols && getProto ? getProto(""[Symbol.iterator]()) : undefined2, "%Symbol%": hasSymbols ? Symbol : undefined2, "%SyntaxError%": $SyntaxError, "%ThrowTypeError%": ThrowTypeError, @@ -89740,11 +89755,13 @@ var require_get_intrinsic = __commonJS({ "%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef, "%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet }; - try { - null.error; - } catch (e) { - errorProto = getProto(getProto(e)); - INTRINSICS["%Error.prototype%"] = errorProto; + if (getProto) { + try { + null.error; + } catch (e) { + errorProto = getProto(getProto(e)); + INTRINSICS["%Error.prototype%"] = errorProto; + } } var errorProto; var doEval = function doEval2(name) { @@ -89762,7 +89779,7 @@ var require_get_intrinsic = __commonJS({ } } else if (name === "%AsyncIteratorPrototype%") { var gen = doEval2("%AsyncGenerator%"); - if (gen) { + if (gen && getProto) { value = getProto(gen.prototype); } } diff --git a/tools/actions/turborepo-s3-cache/build/server.js b/tools/actions/turborepo-s3-cache/build/server.js index ddb4019a6322..c83408efe779 100644 --- a/tools/actions/turborepo-s3-cache/build/server.js +++ b/tools/actions/turborepo-s3-cache/build/server.js @@ -35372,6 +35372,20 @@ var require_has_symbols = __commonJS({ } }); +// ../../../node_modules/.pnpm/has-proto@1.0.1/node_modules/has-proto/index.js +var require_has_proto = __commonJS({ + "../../../node_modules/.pnpm/has-proto@1.0.1/node_modules/has-proto/index.js"(exports, module2) { + "use strict"; + var test = { + foo: {} + }; + var $Object = Object; + module2.exports = function hasProto() { + return { __proto__: test }.foo === test.foo && !({ __proto__: null } instanceof $Object); + }; + } +}); + // ../../../node_modules/.pnpm/function-bind@1.1.1/node_modules/function-bind/implementation.js var require_implementation = __commonJS({ "../../../node_modules/.pnpm/function-bind@1.1.1/node_modules/function-bind/implementation.js"(exports, module2) { @@ -35440,9 +35454,9 @@ var require_src2 = __commonJS({ } }); -// ../../../node_modules/.pnpm/get-intrinsic@1.2.0/node_modules/get-intrinsic/index.js +// ../../../node_modules/.pnpm/get-intrinsic@1.2.1/node_modules/get-intrinsic/index.js var require_get_intrinsic = __commonJS({ - "../../../node_modules/.pnpm/get-intrinsic@1.2.0/node_modules/get-intrinsic/index.js"(exports, module2) { + "../../../node_modules/.pnpm/get-intrinsic@1.2.1/node_modules/get-intrinsic/index.js"(exports, module2) { "use strict"; var undefined2; var $SyntaxError = SyntaxError; @@ -35478,16 +35492,17 @@ var require_get_intrinsic = __commonJS({ } }() : throwTypeError; var hasSymbols = require_has_symbols()(); - var getProto = Object.getPrototypeOf || function(x3) { + var hasProto = require_has_proto()(); + var getProto = Object.getPrototypeOf || (hasProto ? function(x3) { return x3.__proto__; - }; + } : null); var needsEval = {}; - var TypedArray = typeof Uint8Array === "undefined" ? undefined2 : getProto(Uint8Array); + var TypedArray = typeof Uint8Array === "undefined" || !getProto ? undefined2 : getProto(Uint8Array); var INTRINSICS = { "%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError, "%Array%": Array, "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer, - "%ArrayIteratorPrototype%": hasSymbols ? getProto([][Symbol.iterator]()) : undefined2, + "%ArrayIteratorPrototype%": hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined2, "%AsyncFromSyncIteratorPrototype%": undefined2, "%AsyncFunction%": needsEval, "%AsyncGenerator%": needsEval, @@ -35518,10 +35533,10 @@ var require_get_intrinsic = __commonJS({ "%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array, "%isFinite%": isFinite, "%isNaN%": isNaN, - "%IteratorPrototype%": hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined2, + "%IteratorPrototype%": hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined2, "%JSON%": typeof JSON === "object" ? JSON : undefined2, "%Map%": typeof Map === "undefined" ? undefined2 : Map, - "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols ? undefined2 : getProto((/* @__PURE__ */ new Map())[Symbol.iterator]()), + "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Map())[Symbol.iterator]()), "%Math%": Math, "%Number%": Number, "%Object%": Object, @@ -35534,10 +35549,10 @@ var require_get_intrinsic = __commonJS({ "%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect, "%RegExp%": RegExp, "%Set%": typeof Set === "undefined" ? undefined2 : Set, - "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols ? undefined2 : getProto((/* @__PURE__ */ new Set())[Symbol.iterator]()), + "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Set())[Symbol.iterator]()), "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer, "%String%": String, - "%StringIteratorPrototype%": hasSymbols ? getProto(""[Symbol.iterator]()) : undefined2, + "%StringIteratorPrototype%": hasSymbols && getProto ? getProto(""[Symbol.iterator]()) : undefined2, "%Symbol%": hasSymbols ? Symbol : undefined2, "%SyntaxError%": $SyntaxError, "%ThrowTypeError%": ThrowTypeError, @@ -35552,11 +35567,13 @@ var require_get_intrinsic = __commonJS({ "%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef, "%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet }; - try { - null.error; - } catch (e5) { - errorProto = getProto(getProto(e5)); - INTRINSICS["%Error.prototype%"] = errorProto; + if (getProto) { + try { + null.error; + } catch (e5) { + errorProto = getProto(getProto(e5)); + INTRINSICS["%Error.prototype%"] = errorProto; + } } var errorProto; var doEval = function doEval2(name) { @@ -35574,7 +35591,7 @@ var require_get_intrinsic = __commonJS({ } } else if (name === "%AsyncIteratorPrototype%") { var gen = doEval2("%AsyncGenerator%"); - if (gen) { + if (gen && getProto) { value = getProto(gen.prototype); } }