From bdbd24e288ab4dd08f54638ad59f7cba5f267049 Mon Sep 17 00:00:00 2001 From: Tulio Miranda Date: Fri, 22 May 2026 13:06:15 -0300 Subject: [PATCH 1/8] chore: bump version to 0.39.0-rc.1 (#875) --- android/app/build.gradle | 4 ++-- ios/HathorMobile.xcodeproj/project.pbxproj | 8 ++++---- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 6a56061f9..31eb43fa6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -84,8 +84,8 @@ android { applicationId "network.hathor.wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 124 - versionName "0.38.0" + versionCode 125 + versionName "0.39.0-rc.1" missingDimensionStrategy "react-native-camera", "general" } diff --git a/ios/HathorMobile.xcodeproj/project.pbxproj b/ios/HathorMobile.xcodeproj/project.pbxproj index fd55ae955..8fd75aba9 100644 --- a/ios/HathorMobile.xcodeproj/project.pbxproj +++ b/ios/HathorMobile.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 1.0.0; + CURRENT_PROJECT_VERSION = 0.1.0; DEVELOPMENT_TEAM = 55SHY647CG; ENABLE_BITCODE = NO; INFOPLIST_FILE = HathorMobile/Info.plist; @@ -435,7 +435,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.38.0; + MARKETING_VERSION = 0.39.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -457,7 +457,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 1.0.0; + CURRENT_PROJECT_VERSION = 0.1.0; DEVELOPMENT_TEAM = 55SHY647CG; INFOPLIST_FILE = HathorMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; @@ -465,7 +465,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.38.0; + MARKETING_VERSION = 0.39.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/package-lock.json b/package-lock.json index 6474b9575..10be2812f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "HathorMobile", - "version": "0.38.0", + "version": "0.39.0-rc.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "HathorMobile", - "version": "0.38.0", + "version": "0.39.0-rc.1", "dependencies": { "@ethersproject/shims": "5.7.0", "@fortawesome/fontawesome-svg-core": "6.7.2", diff --git a/package.json b/package.json index c736442ac..6846d0f16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "HathorMobile", - "version": "0.38.0", + "version": "0.39.0-rc.1", "engines": { "node": ">=18.0.0", "npm": ">=10.0.0" From ecfb0a3bcafa1434d923cd1be330e9909b156214 Mon Sep 17 00:00:00 2001 From: Raul Oliveira <38788084+raul-oliveira@users.noreply.github.com> Date: Wed, 27 May 2026 12:42:03 -0300 Subject: [PATCH 2/8] fix: rc errors on importing and sending fbt (#876) * fix: version field missing when importing tokens with the import tokens modal * fix: build tx behavior in the send tokens flow * chore: pot files * refact: simplify the release utxos * refact: simplify the release utxos * chore: update pot files --- locale/da/texts.po | 87 ++++++------ locale/pt-br/texts.po | 93 +++++++------ locale/ru-ru/texts.po | 87 ++++++------ locale/texts.pot | 94 +++++++------ src/sagas/tokenImport.js | 13 +- src/screens/SendAmountInput.js | 72 +--------- src/screens/SendConfirmScreen.js | 221 +++++++++++++++++++++---------- 7 files changed, 360 insertions(+), 307 deletions(-) diff --git a/locale/da/texts.po b/locale/da/texts.po index 000437215..0a7dacd97 100644 --- a/locale/da/texts.po +++ b/locale/da/texts.po @@ -326,7 +326,7 @@ msgid "Back" msgstr "" #: src/screens/CreateTokenAmount.js:96 src/screens/CreateTokenAmount.js:108 -#: src/screens/SendAmountInput.js:142 +#: src/screens/SendAmountInput.js:92 msgid "Invalid amount" msgstr "" @@ -355,7 +355,7 @@ msgstr "" #: src/screens/CreateTokenAmount.js:211 src/screens/CreateTokenName.js:67 #: src/screens/CreateTokenSymbol.js:86 src/screens/InitWallet.js:229 #: src/screens/InitWallet.js:382 src/screens/SendAddressInput.js:66 -#: src/screens/SendAmountInput.js:239 +#: src/screens/SendAmountInput.js:169 msgid "Next" msgstr "Næste" @@ -383,8 +383,8 @@ msgstr "Indtast din 6-cifrede pin for at oprette din token" msgid "Authorize token creation" msgstr "Autoriser oprettelse af token" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:105 -#: src/screens/TokenSwapReview.js:205 +#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:166 +#: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" @@ -962,103 +962,110 @@ msgstr "SEND" msgid "Address to send" msgstr "Adresse, der skal sendes til" -#: src/screens/SendAmountInput.js:147 +#: src/screens/SendAmountInput.js:97 msgid "Insufficient funds" msgstr "Utilstrækkelige midler" -#: src/screens/SendAmountInput.js:154 -msgid "Calculating network fee..." -msgstr "" - -#: src/screens/SendAmountInput.js:161 src/screens/SendAmountInput.js:166 -msgid "Insufficient balance of HTR to cover the network fee." -msgstr "" - -#: src/screens/SendAmountInput.js:193 +#: src/screens/SendAmountInput.js:123 #, javascript-format msgid "${ amountAndToken } available" msgid_plural "${ amountAndToken } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendAmountInput.js:207 src/screens/SendConfirmScreen.js:193 +#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:257 msgid "SEND ${ tokenNameUpperCase }" msgstr "SEND ${ tokenNameUpperCase }" -#: src/screens/SendConfirmScreen.js:33 src/screens/TokenSwapReview.js:304 +#: src/screens/SendConfirmScreen.js:42 src/screens/TokenSwapReview.js:320 msgid "No fee" msgstr "" -#. show loading modal -#: src/screens/SendConfirmScreen.js:90 src/screens/TokenSwapReview.js:189 +#: src/screens/SendConfirmScreen.js:54 +msgid "Insufficient HTR to cover the network fee." +msgstr "" + +#: src/screens/SendConfirmScreen.js:57 +msgid "Insufficient balance to send this transaction." +msgstr "" + +#: src/screens/SendConfirmScreen.js:59 +msgid "Failed to build transaction." +msgstr "" + +#: src/screens/SendConfirmScreen.js:146 src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "Din overførsel behandles" -#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:103 -#: src/screens/TokenSwapReview.js:203 +#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:164 +#: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "Indtast din 6-cifrede pin for at godkende overførslen" -#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:104 -#: src/screens/TokenSwapReview.js:204 +#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:165 +#: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "Autoriserer overførslen" -#: src/screens/SendConfirmScreen.js:140 +#: src/screens/SendConfirmScreen.js:205 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendConfirmScreen.js:164 +#: src/screens/SendConfirmScreen.js:228 msgid "Loading fee information..." msgstr "" -#: src/screens/SendConfirmScreen.js:167 +#: src/screens/SendConfirmScreen.js:231 msgid "This is the native token, no network fees are charged." msgstr "" -#: src/screens/SendConfirmScreen.js:170 +#: src/screens/SendConfirmScreen.js:234 msgid "This token is Deposit Based, no network fee will be charged." msgstr "" -#: src/screens/SendConfirmScreen.js:172 +#: src/screens/SendConfirmScreen.js:236 msgid "This fee is fixed and required for every transfer of this token." msgstr "" #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:177 +#: src/screens/SendConfirmScreen.js:241 msgid "Loading..." msgstr "" -#: src/screens/SendConfirmScreen.js:202 +#: src/screens/SendConfirmScreen.js:263 +msgid "Building your transaction" +msgstr "" + +#: src/screens/SendConfirmScreen.js:281 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "" -#: src/screens/SendConfirmScreen.js:213 +#: src/screens/SendConfirmScreen.js:292 msgid "Read more." msgstr "" -#: src/screens/SendConfirmScreen.js:229 +#: src/screens/SendConfirmScreen.js:309 msgid "**Transaction summary**" msgstr "" -#: src/screens/SendConfirmScreen.js:232 +#: src/screens/SendConfirmScreen.js:312 msgid "**To**" msgstr "" -#: src/screens/SendConfirmScreen.js:237 +#: src/screens/SendConfirmScreen.js:317 msgid "**Network Fee**" msgstr "" -#: src/screens/SendConfirmScreen.js:245 +#: src/screens/SendConfirmScreen.js:325 msgid "**Total**" msgstr "" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:252 +#: src/screens/SendConfirmScreen.js:332 msgid "Send" msgstr "Send" @@ -1145,25 +1152,25 @@ msgstr "" msgid "Loading Token Swap" msgstr "" -#: src/screens/TokenSwapReview.js:215 +#: src/screens/TokenSwapReview.js:231 msgid "REVIEW TOKEN SWAP" msgstr "" -#: src/screens/TokenSwapReview.js:221 +#: src/screens/TokenSwapReview.js:237 msgid "Building the swap transaction for your review" msgstr "" -#: src/screens/TokenSwapReview.js:239 +#: src/screens/TokenSwapReview.js:255 msgid "Your swap was successful" msgstr "" #: src/components/Reown/CreateTokenRequest.js:130 #: src/components/Reown/TransactionFees.js:55 -#: src/screens/TokenSwapReview.js:300 +#: src/screens/TokenSwapReview.js:316 msgid "Network Fee" msgstr "" -#: src/screens/TokenSwapReview.js:312 +#: src/screens/TokenSwapReview.js:328 msgid "SWAP" msgstr "" diff --git a/locale/pt-br/texts.po b/locale/pt-br/texts.po index b5293acea..b67698ffc 100644 --- a/locale/pt-br/texts.po +++ b/locale/pt-br/texts.po @@ -339,7 +339,7 @@ msgid "Back" msgstr "Voltar" #: src/screens/CreateTokenAmount.js:96 src/screens/CreateTokenAmount.js:108 -#: src/screens/SendAmountInput.js:142 +#: src/screens/SendAmountInput.js:92 msgid "Invalid amount" msgstr "Quantidade inválida" @@ -368,7 +368,7 @@ msgstr "Quantidade de ${ name } (${ symbol })" #: src/screens/CreateTokenAmount.js:211 src/screens/CreateTokenName.js:67 #: src/screens/CreateTokenSymbol.js:86 src/screens/InitWallet.js:229 #: src/screens/InitWallet.js:382 src/screens/SendAddressInput.js:66 -#: src/screens/SendAmountInput.js:239 +#: src/screens/SendAmountInput.js:169 msgid "Next" msgstr "Próximo" @@ -400,8 +400,8 @@ msgstr "Digite seu PIN de 6 dígitos para criar o seu token" msgid "Authorize token creation" msgstr "Autorizar criação de token" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:105 -#: src/screens/TokenSwapReview.js:205 +#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:166 +#: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "Criando transação" @@ -991,103 +991,110 @@ msgstr "ENVIAR" msgid "Address to send" msgstr "Endereço para enviar" -#: src/screens/SendAmountInput.js:147 +#: src/screens/SendAmountInput.js:97 msgid "Insufficient funds" msgstr "Saldo insuficiente" -#: src/screens/SendAmountInput.js:154 -msgid "Calculating network fee..." -msgstr "Calculando taxa da rede..." - -#: src/screens/SendAmountInput.js:161 src/screens/SendAmountInput.js:166 -msgid "Insufficient balance of HTR to cover the network fee." -msgstr "Saldo insuficiente para cobrir a taxa da rede." - -#: src/screens/SendAmountInput.js:193 +#: src/screens/SendAmountInput.js:123 #, javascript-format msgid "${ amountAndToken } available" msgid_plural "${ amountAndToken } available" msgstr[0] "${ amountAndToken } disponível" msgstr[1] "${ amountAndToken } disponíveis" -#: src/screens/SendAmountInput.js:207 src/screens/SendConfirmScreen.js:193 +#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:257 msgid "SEND ${ tokenNameUpperCase }" msgstr "ENVIAR ${ tokenNameUpperCase }" -#: src/screens/SendConfirmScreen.js:33 src/screens/TokenSwapReview.js:304 +#: src/screens/SendConfirmScreen.js:42 src/screens/TokenSwapReview.js:320 msgid "No fee" msgstr "Sem taxa" -#. show loading modal -#: src/screens/SendConfirmScreen.js:90 src/screens/TokenSwapReview.js:189 +#: src/screens/SendConfirmScreen.js:54 +msgid "Insufficient HTR to cover the network fee." +msgstr "Saldo insuficiente de HTR para cobrir a taxa da rede." + +#: src/screens/SendConfirmScreen.js:57 +msgid "Insufficient balance to send this transaction." +msgstr "Saldo insuficiente para completar a transação." + +#: src/screens/SendConfirmScreen.js:59 +msgid "Failed to build transaction." +msgstr "Falha ao criar a transação" + +#: src/screens/SendConfirmScreen.js:146 src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "Sua transferência está sendo processada" -#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:103 -#: src/screens/TokenSwapReview.js:203 +#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:164 +#: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "Digite seu PIN de 6 dígitos para autorizar a operação" -#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:104 -#: src/screens/TokenSwapReview.js:204 +#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:165 +#: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "Autorizar operação" -#: src/screens/SendConfirmScreen.js:140 +#: src/screens/SendConfirmScreen.js:205 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" msgstr[0] "Você tem ${ availablePretty } disponível" msgstr[1] "Você tem ${ availablePretty } disponíveis" -#: src/screens/SendConfirmScreen.js:164 +#: src/screens/SendConfirmScreen.js:228 msgid "Loading fee information..." msgstr "Carregando informações da taxa..." -#: src/screens/SendConfirmScreen.js:167 +#: src/screens/SendConfirmScreen.js:231 msgid "This is the native token, no network fees are charged." msgstr "Token nativo, nenhuma taxa aplicada." -#: src/screens/SendConfirmScreen.js:170 +#: src/screens/SendConfirmScreen.js:234 msgid "This token is Deposit Based, no network fee will be charged." msgstr "Este token é de Depósito, nenhuma taxa de rede será cobrada." -#: src/screens/SendConfirmScreen.js:172 +#: src/screens/SendConfirmScreen.js:236 msgid "This fee is fixed and required for every transfer of this token." msgstr "Esta taxa é fixa e obrigatória para cada transação deste token." #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:177 +#: src/screens/SendConfirmScreen.js:241 msgid "Loading..." msgstr "Carregando..." -#: src/screens/SendConfirmScreen.js:202 +#: src/screens/SendConfirmScreen.js:263 +msgid "Building your transaction" +msgstr "Criando sua transação" + +#: src/screens/SendConfirmScreen.js:281 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "Sua transferência de **${ amountAndToken }** foi confirmada" -#: src/screens/SendConfirmScreen.js:213 +#: src/screens/SendConfirmScreen.js:292 msgid "Read more." msgstr "Ler mais." -#: src/screens/SendConfirmScreen.js:229 +#: src/screens/SendConfirmScreen.js:309 msgid "**Transaction summary**" msgstr "**Resumo da transação**" -#: src/screens/SendConfirmScreen.js:232 +#: src/screens/SendConfirmScreen.js:312 msgid "**To**" msgstr "**Para**" -#: src/screens/SendConfirmScreen.js:237 +#: src/screens/SendConfirmScreen.js:317 msgid "**Network Fee**" msgstr "**Taxa de Rede**" -#: src/screens/SendConfirmScreen.js:245 +#: src/screens/SendConfirmScreen.js:325 msgid "**Total**" msgstr "**Total**" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:252 +#: src/screens/SendConfirmScreen.js:332 msgid "Send" msgstr "Enviar" @@ -1174,25 +1181,25 @@ msgstr "Ocorreu um erro ao carregar o protocolo de troca de tokens." msgid "Loading Token Swap" msgstr "Carregando troca de tokens" -#: src/screens/TokenSwapReview.js:215 +#: src/screens/TokenSwapReview.js:231 msgid "REVIEW TOKEN SWAP" msgstr "REVISAR TROCA DE TOKENS" -#: src/screens/TokenSwapReview.js:221 +#: src/screens/TokenSwapReview.js:237 msgid "Building the swap transaction for your review" msgstr "Criando transação de swap para ser revisada" -#: src/screens/TokenSwapReview.js:239 +#: src/screens/TokenSwapReview.js:255 msgid "Your swap was successful" msgstr "Sua troca foi bem-sucedida" #: src/components/Reown/CreateTokenRequest.js:130 #: src/components/Reown/TransactionFees.js:55 -#: src/screens/TokenSwapReview.js:300 +#: src/screens/TokenSwapReview.js:316 msgid "Network Fee" msgstr "Taxa de Rede" -#: src/screens/TokenSwapReview.js:312 +#: src/screens/TokenSwapReview.js:328 msgid "SWAP" msgstr "TROCAR" @@ -2849,6 +2856,12 @@ msgstr "${ tokenSymbol } Conceder Authority" msgid "${ tokenSymbol } Acquire Authority" msgstr "${ tokenSymbol } Obter Authority" +#~ msgid "Calculating network fee..." +#~ msgstr "Calculando taxa da rede..." + +#~ msgid "Insufficient balance of HTR to cover the network fee." +#~ msgstr "Saldo insuficiente para cobrir a taxa da rede." + #~ msgid "Calculating…" #~ msgstr "Calculando…" diff --git a/locale/ru-ru/texts.po b/locale/ru-ru/texts.po index 8ea81a37c..be6e3d4df 100644 --- a/locale/ru-ru/texts.po +++ b/locale/ru-ru/texts.po @@ -327,7 +327,7 @@ msgid "Back" msgstr "" #: src/screens/CreateTokenAmount.js:96 src/screens/CreateTokenAmount.js:108 -#: src/screens/SendAmountInput.js:142 +#: src/screens/SendAmountInput.js:92 msgid "Invalid amount" msgstr "" @@ -356,7 +356,7 @@ msgstr "" #: src/screens/CreateTokenAmount.js:211 src/screens/CreateTokenName.js:67 #: src/screens/CreateTokenSymbol.js:86 src/screens/InitWallet.js:229 #: src/screens/InitWallet.js:382 src/screens/SendAddressInput.js:66 -#: src/screens/SendAmountInput.js:239 +#: src/screens/SendAmountInput.js:169 msgid "Next" msgstr "Далее" @@ -384,8 +384,8 @@ msgstr "Введите 6-значный PIN-код для создания то msgid "Authorize token creation" msgstr "Авторизовать создание токена" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:105 -#: src/screens/TokenSwapReview.js:205 +#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:166 +#: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" @@ -963,19 +963,11 @@ msgstr "ОТПРАВИТЬ" msgid "Address to send" msgstr "Адрес отправки" -#: src/screens/SendAmountInput.js:147 +#: src/screens/SendAmountInput.js:97 msgid "Insufficient funds" msgstr "Недостаточно средств" -#: src/screens/SendAmountInput.js:154 -msgid "Calculating network fee..." -msgstr "" - -#: src/screens/SendAmountInput.js:161 src/screens/SendAmountInput.js:166 -msgid "Insufficient balance of HTR to cover the network fee." -msgstr "" - -#: src/screens/SendAmountInput.js:193 +#: src/screens/SendAmountInput.js:123 #, javascript-format msgid "${ amountAndToken } available" msgid_plural "${ amountAndToken } available" @@ -983,30 +975,41 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/screens/SendAmountInput.js:207 src/screens/SendConfirmScreen.js:193 +#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:257 msgid "SEND ${ tokenNameUpperCase }" msgstr "ОТПРАВИТЬ ${ tokenNameUpperCase }" -#: src/screens/SendConfirmScreen.js:33 src/screens/TokenSwapReview.js:304 +#: src/screens/SendConfirmScreen.js:42 src/screens/TokenSwapReview.js:320 msgid "No fee" msgstr "" -#. show loading modal -#: src/screens/SendConfirmScreen.js:90 src/screens/TokenSwapReview.js:189 +#: src/screens/SendConfirmScreen.js:54 +msgid "Insufficient HTR to cover the network fee." +msgstr "" + +#: src/screens/SendConfirmScreen.js:57 +msgid "Insufficient balance to send this transaction." +msgstr "" + +#: src/screens/SendConfirmScreen.js:59 +msgid "Failed to build transaction." +msgstr "" + +#: src/screens/SendConfirmScreen.js:146 src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "Ваш перевод обрабатывается" -#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:103 -#: src/screens/TokenSwapReview.js:203 +#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:164 +#: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "Введите 6-значный PIN-код для авторизации операции" -#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:104 -#: src/screens/TokenSwapReview.js:204 +#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:165 +#: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "Авторизовать операцию" -#: src/screens/SendConfirmScreen.js:140 +#: src/screens/SendConfirmScreen.js:205 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" @@ -1014,54 +1017,58 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/screens/SendConfirmScreen.js:164 +#: src/screens/SendConfirmScreen.js:228 msgid "Loading fee information..." msgstr "" -#: src/screens/SendConfirmScreen.js:167 +#: src/screens/SendConfirmScreen.js:231 msgid "This is the native token, no network fees are charged." msgstr "" -#: src/screens/SendConfirmScreen.js:170 +#: src/screens/SendConfirmScreen.js:234 msgid "This token is Deposit Based, no network fee will be charged." msgstr "" -#: src/screens/SendConfirmScreen.js:172 +#: src/screens/SendConfirmScreen.js:236 msgid "This fee is fixed and required for every transfer of this token." msgstr "" #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:177 +#: src/screens/SendConfirmScreen.js:241 msgid "Loading..." msgstr "" -#: src/screens/SendConfirmScreen.js:202 +#: src/screens/SendConfirmScreen.js:263 +msgid "Building your transaction" +msgstr "" + +#: src/screens/SendConfirmScreen.js:281 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "Ваш перевод **${ amountAndToken }** был подтвержден" -#: src/screens/SendConfirmScreen.js:213 +#: src/screens/SendConfirmScreen.js:292 msgid "Read more." msgstr "" -#: src/screens/SendConfirmScreen.js:229 +#: src/screens/SendConfirmScreen.js:309 msgid "**Transaction summary**" msgstr "" -#: src/screens/SendConfirmScreen.js:232 +#: src/screens/SendConfirmScreen.js:312 msgid "**To**" msgstr "" -#: src/screens/SendConfirmScreen.js:237 +#: src/screens/SendConfirmScreen.js:317 msgid "**Network Fee**" msgstr "" -#: src/screens/SendConfirmScreen.js:245 +#: src/screens/SendConfirmScreen.js:325 msgid "**Total**" msgstr "" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:252 +#: src/screens/SendConfirmScreen.js:332 msgid "Send" msgstr "Отправить" @@ -1148,25 +1155,25 @@ msgstr "" msgid "Loading Token Swap" msgstr "" -#: src/screens/TokenSwapReview.js:215 +#: src/screens/TokenSwapReview.js:231 msgid "REVIEW TOKEN SWAP" msgstr "" -#: src/screens/TokenSwapReview.js:221 +#: src/screens/TokenSwapReview.js:237 msgid "Building the swap transaction for your review" msgstr "" -#: src/screens/TokenSwapReview.js:239 +#: src/screens/TokenSwapReview.js:255 msgid "Your swap was successful" msgstr "" #: src/components/Reown/CreateTokenRequest.js:130 #: src/components/Reown/TransactionFees.js:55 -#: src/screens/TokenSwapReview.js:300 +#: src/screens/TokenSwapReview.js:316 msgid "Network Fee" msgstr "" -#: src/screens/TokenSwapReview.js:312 +#: src/screens/TokenSwapReview.js:328 msgid "SWAP" msgstr "" diff --git a/locale/texts.pot b/locale/texts.pot index 07a565e00..d3b0c6a9b 100644 --- a/locale/texts.pot +++ b/locale/texts.pot @@ -324,7 +324,7 @@ msgstr "" #: src/screens/CreateTokenAmount.js:96 #: src/screens/CreateTokenAmount.js:108 -#: src/screens/SendAmountInput.js:142 +#: src/screens/SendAmountInput.js:92 msgid "Invalid amount" msgstr "" @@ -356,7 +356,7 @@ msgstr "" #: src/screens/InitWallet.js:229 #: src/screens/InitWallet.js:382 #: src/screens/SendAddressInput.js:66 -#: src/screens/SendAmountInput.js:239 +#: src/screens/SendAmountInput.js:169 msgid "Next" msgstr "" @@ -385,8 +385,8 @@ msgid "Authorize token creation" msgstr "" #: src/screens/CreateTokenConfirm.js:158 -#: src/screens/SendConfirmScreen.js:105 -#: src/screens/TokenSwapReview.js:205 +#: src/screens/SendConfirmScreen.js:166 +#: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" @@ -967,109 +967,115 @@ msgstr "" msgid "Address to send" msgstr "" -#: src/screens/SendAmountInput.js:147 +#: src/screens/SendAmountInput.js:97 msgid "Insufficient funds" msgstr "" -#: src/screens/SendAmountInput.js:154 -msgid "Calculating network fee..." -msgstr "" - -#: src/screens/SendAmountInput.js:161 -#: src/screens/SendAmountInput.js:166 -msgid "Insufficient balance of HTR to cover the network fee." -msgstr "" - -#: src/screens/SendAmountInput.js:193 +#: src/screens/SendAmountInput.js:123 #, javascript-format msgid "${ amountAndToken } available" msgid_plural "${ amountAndToken } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendAmountInput.js:207 -#: src/screens/SendConfirmScreen.js:193 +#: src/screens/SendAmountInput.js:137 +#: src/screens/SendConfirmScreen.js:257 msgid "SEND ${ tokenNameUpperCase }" msgstr "" -#: src/screens/SendConfirmScreen.js:33 -#: src/screens/TokenSwapReview.js:304 +#: src/screens/SendConfirmScreen.js:42 +#: src/screens/TokenSwapReview.js:320 msgid "No fee" msgstr "" -#: src/screens/SendConfirmScreen.js:90 -#: src/screens/TokenSwapReview.js:189 -#. show loading modal +#: src/screens/SendConfirmScreen.js:54 +msgid "Insufficient HTR to cover the network fee." +msgstr "" + +#: src/screens/SendConfirmScreen.js:57 +msgid "Insufficient balance to send this transaction." +msgstr "" + +#: src/screens/SendConfirmScreen.js:59 +msgid "Failed to build transaction." +msgstr "" + +#: src/screens/SendConfirmScreen.js:146 +#: src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "" #: src/sagas/helpers.js:147 -#: src/screens/SendConfirmScreen.js:103 -#: src/screens/TokenSwapReview.js:203 +#: src/screens/SendConfirmScreen.js:164 +#: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "" #: src/sagas/helpers.js:148 -#: src/screens/SendConfirmScreen.js:104 -#: src/screens/TokenSwapReview.js:204 +#: src/screens/SendConfirmScreen.js:165 +#: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "" -#: src/screens/SendConfirmScreen.js:140 +#: src/screens/SendConfirmScreen.js:205 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendConfirmScreen.js:164 +#: src/screens/SendConfirmScreen.js:228 msgid "Loading fee information..." msgstr "" -#: src/screens/SendConfirmScreen.js:167 +#: src/screens/SendConfirmScreen.js:231 msgid "This is the native token, no network fees are charged." msgstr "" -#: src/screens/SendConfirmScreen.js:170 +#: src/screens/SendConfirmScreen.js:234 msgid "This token is Deposit Based, no network fee will be charged." msgstr "" -#: src/screens/SendConfirmScreen.js:172 +#: src/screens/SendConfirmScreen.js:236 msgid "This fee is fixed and required for every transfer of this token." msgstr "" #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:177 +#: src/screens/SendConfirmScreen.js:241 msgid "Loading..." msgstr "" -#: src/screens/SendConfirmScreen.js:202 +#: src/screens/SendConfirmScreen.js:263 +msgid "Building your transaction" +msgstr "" + +#: src/screens/SendConfirmScreen.js:281 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "" -#: src/screens/SendConfirmScreen.js:213 +#: src/screens/SendConfirmScreen.js:292 msgid "Read more." msgstr "" -#: src/screens/SendConfirmScreen.js:229 +#: src/screens/SendConfirmScreen.js:309 msgid "**Transaction summary**" msgstr "" -#: src/screens/SendConfirmScreen.js:232 +#: src/screens/SendConfirmScreen.js:312 msgid "**To**" msgstr "" -#: src/screens/SendConfirmScreen.js:237 +#: src/screens/SendConfirmScreen.js:317 msgid "**Network Fee**" msgstr "" -#: src/screens/SendConfirmScreen.js:245 +#: src/screens/SendConfirmScreen.js:325 msgid "**Total**" msgstr "" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:252 +#: src/screens/SendConfirmScreen.js:332 msgid "Send" msgstr "" @@ -1157,25 +1163,25 @@ msgstr "" msgid "Loading Token Swap" msgstr "" -#: src/screens/TokenSwapReview.js:215 +#: src/screens/TokenSwapReview.js:231 msgid "REVIEW TOKEN SWAP" msgstr "" -#: src/screens/TokenSwapReview.js:221 +#: src/screens/TokenSwapReview.js:237 msgid "Building the swap transaction for your review" msgstr "" -#: src/screens/TokenSwapReview.js:239 +#: src/screens/TokenSwapReview.js:255 msgid "Your swap was successful" msgstr "" #: src/components/Reown/CreateTokenRequest.js:130 #: src/components/Reown/TransactionFees.js:55 -#: src/screens/TokenSwapReview.js:300 +#: src/screens/TokenSwapReview.js:316 msgid "Network Fee" msgstr "" -#: src/screens/TokenSwapReview.js:312 +#: src/screens/TokenSwapReview.js:328 msgid "SWAP" msgstr "" diff --git a/src/sagas/tokenImport.js b/src/sagas/tokenImport.js index 320df97b1..e29bdcdda 100644 --- a/src/sagas/tokenImport.js +++ b/src/sagas/tokenImport.js @@ -52,6 +52,7 @@ function* fetchTokenDetails(wallet, uid) { uid, name: details.tokenInfo.name, symbol: details.tokenInfo.symbol, + version: details.tokenInfo.version, }; } } catch (e) { @@ -101,6 +102,7 @@ export function* fetchUnregisteredTokens() { uid: details.uid, name: details.name, symbol: details.symbol, + version: details.version, }; yield put(tokenFetchBalanceRequested(uid, true)); } @@ -135,6 +137,7 @@ export function* handleNewTokenDetection(action) { uid: details.uid, name: details.name, symbol: details.symbol, + version: details.version, }; yield put(tokenFetchBalanceRequested(uid, true)); } @@ -168,11 +171,17 @@ export function* importSelectedTokens(action) { continue; } + const persistedPayload = { + uid: token.uid, + name: token.name, + symbol: token.symbol, + version: token.version, + }; yield call( [wallet.storage, wallet.storage.registerToken], - { uid: token.uid, name: token.name, symbol: token.symbol }, + persistedPayload, ); - yield put(newToken({ uid: token.uid, name: token.name, symbol: token.symbol })); + yield put(newToken(persistedPayload)); yield put(tokenFetchBalanceRequested(token.uid, true)); alreadyRegistered.add(token.uid); diff --git a/src/screens/SendAmountInput.js b/src/screens/SendAmountInput.js index 6550fb4a2..9fc9fb5cb 100644 --- a/src/screens/SendAmountInput.js +++ b/src/screens/SendAmountInput.js @@ -18,7 +18,6 @@ import { useSelector } from 'react-redux'; import { getStatusBarHeight } from 'react-native-status-bar-height'; import { t, ngettext, msgid } from 'ttag'; import { get } from 'lodash'; -import hathorLib, { TokenVersion } from '@hathor/wallet-lib'; import { IS_MULTI_TOKEN } from '../constants'; import { renderValue, isTokenNFT } from '../utils'; @@ -33,7 +32,6 @@ import { COLORS } from '../styles/themes'; import { useNavigation, useParams } from '../hooks/navigation'; const SendAmountInput = () => { - const wallet = useSelector((state) => state.wallet); const selectedToken = useSelector((state) => state.selectedToken); const tokensBalance = useSelector((state) => state.tokensBalance); const tokenMetadata = useSelector((state) => state.tokenMetadata); @@ -48,8 +46,6 @@ const SendAmountInput = () => { const [amountValue, setAmountValue] = useState(null); const [token, setToken] = useState(selectedToken); const [error, setError] = useState(null); - const [networkFee, setNetworkFee] = useState(null); - const [utxos, setUtxos] = useState(null); const inputRef = useRef(null); useEffect(() => { @@ -66,52 +62,6 @@ const SendAmountInput = () => { setToken(selectedToken); }, [selectedToken]); - useEffect(() => { - let cancelled = false; - - const calculateNetworkFee = async () => { - if (token.version !== TokenVersion.FEE) { - setNetworkFee(0n); - return; - } - - if (amountValue == null || amountValue <= 0n) { - setNetworkFee(null); - return; - } - - // Set to null while calculating to indicate loading state - setNetworkFee(null); - setUtxos(null); - - try { - const { utxos: selectedUtxos, changeAmount } = await wallet.getUtxosForAmount( - amountValue, - { token: token.uid } - ); - if (cancelled) return; - - setUtxos(selectedUtxos); - - if (changeAmount) { - // Since there is change, it means we will have the intended output and a change output. - // 2 FBT outputs means the fee value will be payed twice - setNetworkFee(2n * hathorLib.constants.FEE_PER_OUTPUT); - } else { - // No change means that there will only be the intended output. - setNetworkFee(hathorLib.constants.FEE_PER_OUTPUT); - } - } catch (err) { - if (!cancelled) { - setNetworkFee(hathorLib.constants.FEE_PER_OUTPUT); - } - } - }; - - calculateNetworkFee(); - return () => { cancelled = true; }; - }, [wallet, token.uid, token.version, amountValue]); - const focusInput = () => { if (inputRef.current) { inputRef.current.focus(); @@ -148,28 +98,8 @@ const SendAmountInput = () => { return; } - if (token.version === TokenVersion.FEE) { - // Guard against stale/unknown fee - if (networkFee == null) { - setError(t`Calculating network fee...`); - return; - } - // The user selected a fee based token - // So we need to check the HTR balance to make the transaction happen. - const htrBalance = get(tokensBalance, hathorLib.constants.NATIVE_TOKEN_UID); - if (!htrBalance) { - setError(t`Insufficient balance of HTR to cover the network fee.`); - return; - } - const { available: htrAvailable } = htrBalance.data; - if (networkFee > htrAvailable) { - setError(t`Insufficient balance of HTR to cover the network fee.`); - return; - } - } - const { address } = params; - navigation.navigate('SendConfirmScreen', { address, amount: amountValue, token, networkFee, utxos }); + navigation.navigate('SendConfirmScreen', { address, amount: amountValue, token }); }; const isButtonDisabled = () => ( diff --git a/src/screens/SendConfirmScreen.js b/src/screens/SendConfirmScreen.js index a6dd7d3a2..10158d14e 100644 --- a/src/screens/SendConfirmScreen.js +++ b/src/screens/SendConfirmScreen.js @@ -5,8 +5,8 @@ * LICENSE file in the root directory of this source tree. */ -import React, { useState } from 'react'; -import { View, Text, StyleSheet, TouchableOpacity, Linking } from 'react-native'; +import React, { useEffect, useState } from 'react'; +import { View, Text, StyleSheet, TouchableOpacity, Linking, Image } from 'react-native'; import { useSelector } from 'react-redux'; import { msgid, ngettext, t } from 'ttag'; import hathorLib, { TokenVersion } from '@hathor/wallet-lib'; @@ -18,6 +18,8 @@ import OfflineBar from '../components/OfflineBar'; import TextFmt from '../components/TextFmt'; import SendTransactionFeedbackModal from '../components/SendTransactionFeedbackModal'; import TooltipModal from '../components/TooltipModal'; +import FeedbackModal from '../components/FeedbackModal'; +import Spinner from '../components/Spinner'; import { renderValue, isTokenNFT } from '../utils'; import NavigationService from '../NavigationService'; import { useNavigation, useParams } from '../hooks/navigation'; @@ -25,6 +27,13 @@ import { COLORS } from '../styles/themes'; import { InfoCircleIcon } from '../components/Icons/InfoCircle'; import { CheckIcon } from '../components/Icons/Check.icon'; import { TOKEN_DEPOSIT_URL, TOKEN_FEES_URL } from '../constants'; +import errorIcon from '../assets/images/icErrorBig.png'; + +const PHASE = Object.freeze({ + BUILDING: 'building', + ERROR: 'error', + READY: 'ready', +}); function NoFee() { return ( @@ -35,6 +44,21 @@ function NoFee() { ); } +// Wallet-lib raises "No UTXOs available for the token ." when auto- +// selection can't cover the amount. HTR shortage gets its own message because, +// on FBT sends, it means insufficient HTR for the network fee. +function mapBuildError(err) { + const msg = err?.message || ''; + const htrUid = hathorLib.constants.NATIVE_TOKEN_UID; + if (msg.includes(`No UTXOs available for the token ${htrUid}`)) { + return t`Insufficient HTR to cover the network fee.`; + } + if (msg.includes('No UTXOs available for the token')) { + return t`Insufficient balance to send this transaction.`; + } + return msg || t`Failed to build transaction.`; +} + const SendConfirmScreen = () => { const tokensBalance = useSelector((state) => state.tokensBalance); const wallet = useSelector((state) => state.wallet); @@ -47,50 +71,87 @@ const SendConfirmScreen = () => { const params = useParams(); // Parse and store navigation params - const { amount, address, token, networkFee, utxos } = params; + const { amount, address, token } = params; const isNFT = isTokenNFT(token.uid, tokenMetadata); const amountAndToken = `${renderValue(amount, isNFT)} ${token.symbol}`; + const [phase, setPhase] = useState(PHASE.BUILDING); + const [sendTx, setSendTx] = useState(null); + const [buildError, setBuildError] = useState(null); const [modal, setModal] = useState(null); const [isTooltipShown, setIsTooltipShown] = useState(false); const nativeSymbol = hathorLib.constants.DEFAULT_NATIVE_TOKEN_CONFIG.symbol; + // Build the transaction on mount (without inputs — let the lib auto-select + // FBT and HTR UTXOs). This produces the exact fee the user will pay, which + // we then show on the review screen. + useEffect(() => { + let cancelled = false; + + (async () => { + try { + const outputs = [{ address, value: amount, token: token.uid }]; + const sendTransaction = useWalletService + ? new hathorLib.SendTransactionWalletService(wallet, { outputs }) + : new hathorLib.SendTransaction({ storage: wallet.storage, outputs }); + + await sendTransaction.run('prepare-tx'); + + if (cancelled) { + try { await sendTransaction.releaseUtxos(); } catch (e) { console.error(e); } + return; + } + + setSendTx(sendTransaction); + setPhase(PHASE.READY); + } catch (err) { + if (cancelled) return; + console.error(err); + setBuildError({ message: mapBuildError(err) }); + setPhase(PHASE.ERROR); + } + })(); + + return () => { cancelled = true; }; + }, []); + + // Release reserved UTXOs on unmount. Safe to call unconditionally: + // no-op if the tx was already broadcast (UTXOs already cleared from the + // selection map) and skipped if no tx was built. + useEffect(() => () => { + if (sendTx) { + sendTx.releaseUtxos().catch((err) => console.error(err)); + } + }, [sendTx]); + + const networkFee = phase === PHASE.READY && sendTx + ? (sendTx.transaction.getFeeHeader()?.entries?.[0]?.amount ?? 0n) + : null; + /** - * In case we can prepare the data, open send tx feedback modal (while sending the tx) - * Otherwise, show error + * Sign and broadcast the pre-built transaction. Failures transition + * the flow to PHASE.ERROR. * - * @param {String} pin User PIN already validated + * @param {string} pin Validated user PIN */ const executeSend = async (pin) => { - const outputs = [{ address, value: amount, token: token.uid }]; - const inputs = utxos - ? utxos.map(({ txId, index }) => ({ txId, index })) - : []; - let sendTransaction; - - if (useWalletService) { - await wallet.validateAndRenewAuthToken(pin); - - sendTransaction = new hathorLib.SendTransactionWalletService(wallet, { - outputs, - inputs, - pin, + try { + if (useWalletService) { + await wallet.validateAndRenewAuthToken(pin); + } + await wallet.signTx(sendTx.transaction, { pinCode: pin }); + const promise = sendTx.runFromMining(); + setModal({ + text: t`Your transfer is being processed`, + sendTransaction: sendTx, + promise, }); - } else { - sendTransaction = new hathorLib.SendTransaction( - { storage: wallet.storage, outputs, inputs, pin } - ); + } catch (err) { + console.error(err); + setBuildError({ message: mapBuildError(err) }); + setPhase(PHASE.ERROR); } - - const promise = sendTransaction.run(); - - // show loading modal - setModal({ - text: t`Your transfer is being processed`, - sendTransaction, - promise, - }); }; /** @@ -132,6 +193,10 @@ const SendConfirmScreen = () => { }, 500); }; + const dismissBuildError = () => { + navigation.goBack(); + }; + const getAvailableString = () => { const balance = tokensBalance[token.uid].data; const available = balance ? balance.available : 0; @@ -148,7 +213,6 @@ const SendConfirmScreen = () => { const handleTooltipLinkPress = () => { setIsTooltipShown(false); - // Navigate to external link if (token.version === TokenVersion.DEPOSIT) { // for deposit based tokens @@ -181,7 +245,7 @@ const SendConfirmScreen = () => { {renderValue(networkFee, false)} {nativeSymbol} - ) + ); } return ; }; @@ -194,6 +258,21 @@ const SendConfirmScreen = () => { onBackPress={() => navigation.goBack()} /> + {phase === PHASE.BUILDING && ( + } + /> + )} + + {phase === PHASE.ERROR && buildError && ( + } + onDismiss={dismissBuildError} + /> + )} + {modal && ( { onLinkPress={handleTooltipLinkPress} /> - - - - - - {getAvailableString()} - - - - {t`**Transaction summary**`} - - - {t`**To**`} - {address.substr(0, 7)}...{address.substr(-7)} - - - - {t`**Network Fee**`} - - - + {phase === PHASE.READY && ( + + + + + + {getAvailableString()} + + + + {t`**Transaction summary**`} + + + {t`**To**`} + {address.substr(0, 7)}...{address.substr(-7)} + + + + {t`**Network Fee**`} + + + + + {renderNetworkFeeValue()} + + + {t`**Total**`} + {`${amountAndToken}${networkFee ? ` + ${renderValue(networkFee, false)} ${nativeSymbol}` : ''}`} - {renderNetworkFeeValue()} - - - {t`**Total**`} - {`${amountAndToken}${networkFee ? ` + ${renderValue(networkFee, false)} ${nativeSymbol}` : ''}`} + - - + )} ); From a7a2879cd0455991e85a8a465188b82f102212c2 Mon Sep 17 00:00:00 2001 From: Raul Oliveira <38788084+raul-oliveira@users.noreply.github.com> Date: Wed, 27 May 2026 13:35:43 -0300 Subject: [PATCH 3/8] chore: bump to v0.39.0-rc.2 (#877) --- android/app/build.gradle | 4 ++-- ios/HathorMobile.xcodeproj/project.pbxproj | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 31eb43fa6..761605e0c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -84,8 +84,8 @@ android { applicationId "network.hathor.wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 125 - versionName "0.39.0-rc.1" + versionCode 126 + versionName "0.39.0-rc.2" missingDimensionStrategy "react-native-camera", "general" } diff --git a/ios/HathorMobile.xcodeproj/project.pbxproj b/ios/HathorMobile.xcodeproj/project.pbxproj index 8fd75aba9..f20816935 100644 --- a/ios/HathorMobile.xcodeproj/project.pbxproj +++ b/ios/HathorMobile.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.1.0; + CURRENT_PROJECT_VERSION = 0.2.0; DEVELOPMENT_TEAM = 55SHY647CG; ENABLE_BITCODE = NO; INFOPLIST_FILE = HathorMobile/Info.plist; @@ -457,7 +457,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.1.0; + CURRENT_PROJECT_VERSION = 0.2.0; DEVELOPMENT_TEAM = 55SHY647CG; INFOPLIST_FILE = HathorMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; diff --git a/package-lock.json b/package-lock.json index 10be2812f..e3be967da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.1", + "version": "0.39.0-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "HathorMobile", - "version": "0.39.0-rc.1", + "version": "0.39.0-rc.2", "dependencies": { "@ethersproject/shims": "5.7.0", "@fortawesome/fontawesome-svg-core": "6.7.2", diff --git a/package.json b/package.json index 6846d0f16..81376d0bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.1", + "version": "0.39.0-rc.2", "engines": { "node": ">=18.0.0", "npm": ">=10.0.0" From 1ab28971b1d71e6f567addd6d01de1de112a4271 Mon Sep 17 00:00:00 2001 From: Raul Oliveira <38788084+raul-oliveira@users.noreply.github.com> Date: Fri, 29 May 2026 11:35:14 -0300 Subject: [PATCH 4/8] fix: address mode option in settings, tx history with error message, delayed loading modal in confirm send screen (#878) --- locale/da/texts.po | 64 +++++++++++++------------- locale/pt-br/texts.po | 66 +++++++++++++-------------- locale/ru-ru/texts.po | 64 +++++++++++++------------- locale/texts.pot | 66 +++++++++++++-------------- src/components/AmountTextInput.js | 11 ++++- src/screens/CreateTokenConfirm.js | 5 +++ src/screens/MainScreen.js | 13 +++++- src/screens/SendConfirmScreen.js | 74 +++++++++++++++++++++++-------- src/screens/Settings.js | 2 +- 9 files changed, 213 insertions(+), 152 deletions(-) diff --git a/locale/da/texts.po b/locale/da/texts.po index 0a7dacd97..030b0ada1 100644 --- a/locale/da/texts.po +++ b/locale/da/texts.po @@ -383,7 +383,7 @@ msgstr "Indtast din 6-cifrede pin for at oprette din token" msgid "Authorize token creation" msgstr "Autoriser oprettelse af token" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:166 +#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" @@ -397,25 +397,25 @@ msgstr "" msgid "Amount of ${ name }" msgstr "" -#: src/screens/CreateTokenConfirm.js:238 +#: src/screens/CreateTokenConfirm.js:243 msgid "Token name" msgstr "Token navn" -#: src/screens/CreateTokenConfirm.js:244 src/screens/CreateTokenSymbol.js:71 +#: src/screens/CreateTokenConfirm.js:249 src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "Token symbol" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:251 +#: src/screens/CreateTokenConfirm.js:256 msgid "Deposit" msgstr "Indsæt" -#: src/screens/CreateTokenConfirm.js:259 +#: src/screens/CreateTokenConfirm.js:264 msgid "Network fee" msgstr "" -#: src/screens/CreateTokenConfirm.js:268 +#: src/screens/CreateTokenConfirm.js:273 msgid "Create token" msgstr "Opret token" @@ -708,31 +708,31 @@ msgstr "Nulstil wallet" msgid "Connect to mainnet" msgstr "" -#: src/screens/MainScreen.js:125 +#: src/screens/MainScreen.js:136 msgid "No transactions" msgstr "Ingen transaktioner" -#: src/screens/MainScreen.js:128 +#: src/screens/MainScreen.js:139 msgid "|share:Share your address| with friends and start exchanging tokens" msgstr "|share:Del din adresse| med venner og begynd at udveksle tokens" -#: src/screens/MainScreen.js:145 +#: src/screens/MainScreen.js:156 msgid "Loading transactions" msgstr "Indlæser dine transaktioner" -#: src/screens/MainScreen.js:154 +#: src/screens/MainScreen.js:165 msgid "There was an error loading your transaction history" msgstr "" -#: src/screens/MainScreen.js:157 +#: src/screens/MainScreen.js:168 msgid "Please |tryAgain:try again|" msgstr "" -#: src/screens/MainScreen.js:540 src/screens/MainScreen.js:569 +#: src/screens/MainScreen.js:551 src/screens/MainScreen.js:580 msgid "Available Balance" msgstr "Tilgængelig saldo" -#: src/screens/MainScreen.js:549 +#: src/screens/MainScreen.js:560 msgid "Locked" msgstr "Låst" @@ -973,7 +973,7 @@ msgid_plural "${ amountAndToken } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:257 +#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:287 msgid "SEND ${ tokenNameUpperCase }" msgstr "SEND ${ tokenNameUpperCase }" @@ -990,82 +990,82 @@ msgid "Insufficient balance to send this transaction." msgstr "" #: src/screens/SendConfirmScreen.js:59 -msgid "Failed to build transaction." +msgid "Failed to process transaction." msgstr "" -#: src/screens/SendConfirmScreen.js:146 src/screens/TokenSwapReview.js:205 +#: src/screens/SendConfirmScreen.js:178 src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "Din overførsel behandles" -#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:164 +#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:194 #: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "Indtast din 6-cifrede pin for at godkende overførslen" -#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:165 +#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:195 #: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "Autoriserer overførslen" -#: src/screens/SendConfirmScreen.js:205 +#: src/screens/SendConfirmScreen.js:235 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendConfirmScreen.js:228 +#: src/screens/SendConfirmScreen.js:258 msgid "Loading fee information..." msgstr "" -#: src/screens/SendConfirmScreen.js:231 +#: src/screens/SendConfirmScreen.js:261 msgid "This is the native token, no network fees are charged." msgstr "" -#: src/screens/SendConfirmScreen.js:234 +#: src/screens/SendConfirmScreen.js:264 msgid "This token is Deposit Based, no network fee will be charged." msgstr "" -#: src/screens/SendConfirmScreen.js:236 +#: src/screens/SendConfirmScreen.js:266 msgid "This fee is fixed and required for every transfer of this token." msgstr "" #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:241 +#: src/screens/SendConfirmScreen.js:271 msgid "Loading..." msgstr "" -#: src/screens/SendConfirmScreen.js:263 +#: src/screens/SendConfirmScreen.js:293 msgid "Building your transaction" msgstr "" -#: src/screens/SendConfirmScreen.js:281 +#: src/screens/SendConfirmScreen.js:311 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "" -#: src/screens/SendConfirmScreen.js:292 +#: src/screens/SendConfirmScreen.js:322 msgid "Read more." msgstr "" -#: src/screens/SendConfirmScreen.js:309 +#: src/screens/SendConfirmScreen.js:344 msgid "**Transaction summary**" msgstr "" -#: src/screens/SendConfirmScreen.js:312 +#: src/screens/SendConfirmScreen.js:347 msgid "**To**" msgstr "" -#: src/screens/SendConfirmScreen.js:317 +#: src/screens/SendConfirmScreen.js:352 msgid "**Network Fee**" msgstr "" -#: src/screens/SendConfirmScreen.js:325 +#: src/screens/SendConfirmScreen.js:360 msgid "**Total**" msgstr "" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:332 +#: src/screens/SendConfirmScreen.js:367 msgid "Send" msgstr "Send" diff --git a/locale/pt-br/texts.po b/locale/pt-br/texts.po index b67698ffc..a4b472a8a 100644 --- a/locale/pt-br/texts.po +++ b/locale/pt-br/texts.po @@ -400,7 +400,7 @@ msgstr "Digite seu PIN de 6 dígitos para criar o seu token" msgid "Authorize token creation" msgstr "Autorizar criação de token" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:166 +#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "Criando transação" @@ -414,25 +414,25 @@ msgstr "**${ name }** criado com sucesso" msgid "Amount of ${ name }" msgstr "Quantidade de ${ name }" -#: src/screens/CreateTokenConfirm.js:238 +#: src/screens/CreateTokenConfirm.js:243 msgid "Token name" msgstr "Nome do token" -#: src/screens/CreateTokenConfirm.js:244 src/screens/CreateTokenSymbol.js:71 +#: src/screens/CreateTokenConfirm.js:249 src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "Símbolo do token" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:251 +#: src/screens/CreateTokenConfirm.js:256 msgid "Deposit" msgstr "Depósito" -#: src/screens/CreateTokenConfirm.js:259 +#: src/screens/CreateTokenConfirm.js:264 msgid "Network fee" msgstr "Taxa de Rede" -#: src/screens/CreateTokenConfirm.js:268 +#: src/screens/CreateTokenConfirm.js:273 msgid "Create token" msgstr "Criar um token" @@ -732,33 +732,33 @@ msgstr "Resetar Wallet" msgid "Connect to mainnet" msgstr "Conectar à mainnet" -#: src/screens/MainScreen.js:125 +#: src/screens/MainScreen.js:136 msgid "No transactions" msgstr "Nenhuma transação" -#: src/screens/MainScreen.js:128 +#: src/screens/MainScreen.js:139 msgid "|share:Share your address| with friends and start exchanging tokens" msgstr "" "|share:Compartilhe seu endereço| com seus amigos e comece a trocar seus " "tokens" -#: src/screens/MainScreen.js:145 +#: src/screens/MainScreen.js:156 msgid "Loading transactions" msgstr "Carregando transações" -#: src/screens/MainScreen.js:154 +#: src/screens/MainScreen.js:165 msgid "There was an error loading your transaction history" msgstr "Ocorreu um erro ao carregar seu histórico de transações" -#: src/screens/MainScreen.js:157 +#: src/screens/MainScreen.js:168 msgid "Please |tryAgain:try again|" msgstr "Por favor |tryAgain:tente novamente|" -#: src/screens/MainScreen.js:540 src/screens/MainScreen.js:569 +#: src/screens/MainScreen.js:551 src/screens/MainScreen.js:580 msgid "Available Balance" msgstr "Saldo Disponível" -#: src/screens/MainScreen.js:549 +#: src/screens/MainScreen.js:560 msgid "Locked" msgstr "Bloqueado" @@ -1002,7 +1002,7 @@ msgid_plural "${ amountAndToken } available" msgstr[0] "${ amountAndToken } disponível" msgstr[1] "${ amountAndToken } disponíveis" -#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:257 +#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:287 msgid "SEND ${ tokenNameUpperCase }" msgstr "ENVIAR ${ tokenNameUpperCase }" @@ -1019,82 +1019,82 @@ msgid "Insufficient balance to send this transaction." msgstr "Saldo insuficiente para completar a transação." #: src/screens/SendConfirmScreen.js:59 -msgid "Failed to build transaction." -msgstr "Falha ao criar a transação" +msgid "Failed to process transaction." +msgstr "Falha ao processar a transação" -#: src/screens/SendConfirmScreen.js:146 src/screens/TokenSwapReview.js:205 +#: src/screens/SendConfirmScreen.js:178 src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "Sua transferência está sendo processada" -#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:164 +#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:194 #: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "Digite seu PIN de 6 dígitos para autorizar a operação" -#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:165 +#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:195 #: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "Autorizar operação" -#: src/screens/SendConfirmScreen.js:205 +#: src/screens/SendConfirmScreen.js:235 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" msgstr[0] "Você tem ${ availablePretty } disponível" msgstr[1] "Você tem ${ availablePretty } disponíveis" -#: src/screens/SendConfirmScreen.js:228 +#: src/screens/SendConfirmScreen.js:258 msgid "Loading fee information..." msgstr "Carregando informações da taxa..." -#: src/screens/SendConfirmScreen.js:231 +#: src/screens/SendConfirmScreen.js:261 msgid "This is the native token, no network fees are charged." msgstr "Token nativo, nenhuma taxa aplicada." -#: src/screens/SendConfirmScreen.js:234 +#: src/screens/SendConfirmScreen.js:264 msgid "This token is Deposit Based, no network fee will be charged." msgstr "Este token é de Depósito, nenhuma taxa de rede será cobrada." -#: src/screens/SendConfirmScreen.js:236 +#: src/screens/SendConfirmScreen.js:266 msgid "This fee is fixed and required for every transfer of this token." msgstr "Esta taxa é fixa e obrigatória para cada transação deste token." #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:241 +#: src/screens/SendConfirmScreen.js:271 msgid "Loading..." msgstr "Carregando..." -#: src/screens/SendConfirmScreen.js:263 +#: src/screens/SendConfirmScreen.js:293 msgid "Building your transaction" msgstr "Criando sua transação" -#: src/screens/SendConfirmScreen.js:281 +#: src/screens/SendConfirmScreen.js:311 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "Sua transferência de **${ amountAndToken }** foi confirmada" -#: src/screens/SendConfirmScreen.js:292 +#: src/screens/SendConfirmScreen.js:322 msgid "Read more." msgstr "Ler mais." -#: src/screens/SendConfirmScreen.js:309 +#: src/screens/SendConfirmScreen.js:344 msgid "**Transaction summary**" msgstr "**Resumo da transação**" -#: src/screens/SendConfirmScreen.js:312 +#: src/screens/SendConfirmScreen.js:347 msgid "**To**" msgstr "**Para**" -#: src/screens/SendConfirmScreen.js:317 +#: src/screens/SendConfirmScreen.js:352 msgid "**Network Fee**" msgstr "**Taxa de Rede**" -#: src/screens/SendConfirmScreen.js:325 +#: src/screens/SendConfirmScreen.js:360 msgid "**Total**" msgstr "**Total**" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:332 +#: src/screens/SendConfirmScreen.js:367 msgid "Send" msgstr "Enviar" diff --git a/locale/ru-ru/texts.po b/locale/ru-ru/texts.po index be6e3d4df..f784f24af 100644 --- a/locale/ru-ru/texts.po +++ b/locale/ru-ru/texts.po @@ -384,7 +384,7 @@ msgstr "Введите 6-значный PIN-код для создания то msgid "Authorize token creation" msgstr "Авторизовать создание токена" -#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:166 +#: src/screens/CreateTokenConfirm.js:158 src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" @@ -398,25 +398,25 @@ msgstr "" msgid "Amount of ${ name }" msgstr "" -#: src/screens/CreateTokenConfirm.js:238 +#: src/screens/CreateTokenConfirm.js:243 msgid "Token name" msgstr "Имя токена" -#: src/screens/CreateTokenConfirm.js:244 src/screens/CreateTokenSymbol.js:71 +#: src/screens/CreateTokenConfirm.js:249 src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "Символ токена" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:251 +#: src/screens/CreateTokenConfirm.js:256 msgid "Deposit" msgstr "Депозит" -#: src/screens/CreateTokenConfirm.js:259 +#: src/screens/CreateTokenConfirm.js:264 msgid "Network fee" msgstr "" -#: src/screens/CreateTokenConfirm.js:268 +#: src/screens/CreateTokenConfirm.js:273 msgid "Create token" msgstr "Создать токен" @@ -709,32 +709,32 @@ msgstr "Сбросить кошелек" msgid "Connect to mainnet" msgstr "" -#: src/screens/MainScreen.js:125 +#: src/screens/MainScreen.js:136 msgid "No transactions" msgstr "Нет транзакций" -#: src/screens/MainScreen.js:128 +#: src/screens/MainScreen.js:139 msgid "|share:Share your address| with friends and start exchanging tokens" msgstr "" "|share:Поделитесь своим адресом| с друзьями и начните обменивать свои токены" -#: src/screens/MainScreen.js:145 +#: src/screens/MainScreen.js:156 msgid "Loading transactions" msgstr "Загрузка ваших транзакций" -#: src/screens/MainScreen.js:154 +#: src/screens/MainScreen.js:165 msgid "There was an error loading your transaction history" msgstr "" -#: src/screens/MainScreen.js:157 +#: src/screens/MainScreen.js:168 msgid "Please |tryAgain:try again|" msgstr "" -#: src/screens/MainScreen.js:540 src/screens/MainScreen.js:569 +#: src/screens/MainScreen.js:551 src/screens/MainScreen.js:580 msgid "Available Balance" msgstr "Доступный Баланс" -#: src/screens/MainScreen.js:549 +#: src/screens/MainScreen.js:560 msgid "Locked" msgstr "Заблокированный" @@ -975,7 +975,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:257 +#: src/screens/SendAmountInput.js:137 src/screens/SendConfirmScreen.js:287 msgid "SEND ${ tokenNameUpperCase }" msgstr "ОТПРАВИТЬ ${ tokenNameUpperCase }" @@ -992,24 +992,24 @@ msgid "Insufficient balance to send this transaction." msgstr "" #: src/screens/SendConfirmScreen.js:59 -msgid "Failed to build transaction." +msgid "Failed to process transaction." msgstr "" -#: src/screens/SendConfirmScreen.js:146 src/screens/TokenSwapReview.js:205 +#: src/screens/SendConfirmScreen.js:178 src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "Ваш перевод обрабатывается" -#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:164 +#: src/sagas/helpers.js:147 src/screens/SendConfirmScreen.js:194 #: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "Введите 6-значный PIN-код для авторизации операции" -#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:165 +#: src/sagas/helpers.js:148 src/screens/SendConfirmScreen.js:195 #: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "Авторизовать операцию" -#: src/screens/SendConfirmScreen.js:205 +#: src/screens/SendConfirmScreen.js:235 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" @@ -1017,58 +1017,58 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/screens/SendConfirmScreen.js:228 +#: src/screens/SendConfirmScreen.js:258 msgid "Loading fee information..." msgstr "" -#: src/screens/SendConfirmScreen.js:231 +#: src/screens/SendConfirmScreen.js:261 msgid "This is the native token, no network fees are charged." msgstr "" -#: src/screens/SendConfirmScreen.js:234 +#: src/screens/SendConfirmScreen.js:264 msgid "This token is Deposit Based, no network fee will be charged." msgstr "" -#: src/screens/SendConfirmScreen.js:236 +#: src/screens/SendConfirmScreen.js:266 msgid "This fee is fixed and required for every transfer of this token." msgstr "" #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:241 +#: src/screens/SendConfirmScreen.js:271 msgid "Loading..." msgstr "" -#: src/screens/SendConfirmScreen.js:263 +#: src/screens/SendConfirmScreen.js:293 msgid "Building your transaction" msgstr "" -#: src/screens/SendConfirmScreen.js:281 +#: src/screens/SendConfirmScreen.js:311 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "Ваш перевод **${ amountAndToken }** был подтвержден" -#: src/screens/SendConfirmScreen.js:292 +#: src/screens/SendConfirmScreen.js:322 msgid "Read more." msgstr "" -#: src/screens/SendConfirmScreen.js:309 +#: src/screens/SendConfirmScreen.js:344 msgid "**Transaction summary**" msgstr "" -#: src/screens/SendConfirmScreen.js:312 +#: src/screens/SendConfirmScreen.js:347 msgid "**To**" msgstr "" -#: src/screens/SendConfirmScreen.js:317 +#: src/screens/SendConfirmScreen.js:352 msgid "**Network Fee**" msgstr "" -#: src/screens/SendConfirmScreen.js:325 +#: src/screens/SendConfirmScreen.js:360 msgid "**Total**" msgstr "" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:332 +#: src/screens/SendConfirmScreen.js:367 msgid "Send" msgstr "Отправить" diff --git a/locale/texts.pot b/locale/texts.pot index d3b0c6a9b..16af7394d 100644 --- a/locale/texts.pot +++ b/locale/texts.pot @@ -385,7 +385,7 @@ msgid "Authorize token creation" msgstr "" #: src/screens/CreateTokenConfirm.js:158 -#: src/screens/SendConfirmScreen.js:166 +#: src/screens/SendConfirmScreen.js:196 #: src/screens/TokenSwapReview.js:221 msgid "Building transaction" msgstr "" @@ -399,26 +399,26 @@ msgstr "" msgid "Amount of ${ name }" msgstr "" -#: src/screens/CreateTokenConfirm.js:238 +#: src/screens/CreateTokenConfirm.js:243 msgid "Token name" msgstr "" -#: src/screens/CreateTokenConfirm.js:244 +#: src/screens/CreateTokenConfirm.js:249 #: src/screens/CreateTokenSymbol.js:71 msgid "Token symbol" msgstr "" #: src/components/Reown/CreateTokenRequest.js:87 #: src/components/Reown/CreateTokenRequest.js:129 -#: src/screens/CreateTokenConfirm.js:251 +#: src/screens/CreateTokenConfirm.js:256 msgid "Deposit" msgstr "" -#: src/screens/CreateTokenConfirm.js:259 +#: src/screens/CreateTokenConfirm.js:264 msgid "Network fee" msgstr "" -#: src/screens/CreateTokenConfirm.js:268 +#: src/screens/CreateTokenConfirm.js:273 msgid "Create token" msgstr "" @@ -705,32 +705,32 @@ msgstr "" msgid "Connect to mainnet" msgstr "" -#: src/screens/MainScreen.js:125 +#: src/screens/MainScreen.js:136 msgid "No transactions" msgstr "" -#: src/screens/MainScreen.js:128 +#: src/screens/MainScreen.js:139 msgid "|share:Share your address| with friends and start exchanging tokens" msgstr "" -#: src/screens/MainScreen.js:145 +#: src/screens/MainScreen.js:156 msgid "Loading transactions" msgstr "" -#: src/screens/MainScreen.js:154 +#: src/screens/MainScreen.js:165 msgid "There was an error loading your transaction history" msgstr "" -#: src/screens/MainScreen.js:157 +#: src/screens/MainScreen.js:168 msgid "Please |tryAgain:try again|" msgstr "" -#: src/screens/MainScreen.js:540 -#: src/screens/MainScreen.js:569 +#: src/screens/MainScreen.js:551 +#: src/screens/MainScreen.js:580 msgid "Available Balance" msgstr "" -#: src/screens/MainScreen.js:549 +#: src/screens/MainScreen.js:560 msgid "Locked" msgstr "" @@ -979,7 +979,7 @@ msgstr[0] "" msgstr[1] "" #: src/screens/SendAmountInput.js:137 -#: src/screens/SendConfirmScreen.js:257 +#: src/screens/SendConfirmScreen.js:287 msgid "SEND ${ tokenNameUpperCase }" msgstr "" @@ -997,85 +997,85 @@ msgid "Insufficient balance to send this transaction." msgstr "" #: src/screens/SendConfirmScreen.js:59 -msgid "Failed to build transaction." +msgid "Failed to process transaction." msgstr "" -#: src/screens/SendConfirmScreen.js:146 +#: src/screens/SendConfirmScreen.js:178 #: src/screens/TokenSwapReview.js:205 msgid "Your transfer is being processed" msgstr "" #: src/sagas/helpers.js:147 -#: src/screens/SendConfirmScreen.js:164 +#: src/screens/SendConfirmScreen.js:194 #: src/screens/TokenSwapReview.js:219 msgid "Enter your 6-digit pin to authorize operation" msgstr "" #: src/sagas/helpers.js:148 -#: src/screens/SendConfirmScreen.js:165 +#: src/screens/SendConfirmScreen.js:195 #: src/screens/TokenSwapReview.js:220 msgid "Authorize operation" msgstr "" -#: src/screens/SendConfirmScreen.js:205 +#: src/screens/SendConfirmScreen.js:235 #, javascript-format msgid "${ availablePretty } available" msgid_plural "${ availablePretty } available" msgstr[0] "" msgstr[1] "" -#: src/screens/SendConfirmScreen.js:228 +#: src/screens/SendConfirmScreen.js:258 msgid "Loading fee information..." msgstr "" -#: src/screens/SendConfirmScreen.js:231 +#: src/screens/SendConfirmScreen.js:261 msgid "This is the native token, no network fees are charged." msgstr "" -#: src/screens/SendConfirmScreen.js:234 +#: src/screens/SendConfirmScreen.js:264 msgid "This token is Deposit Based, no network fee will be charged." msgstr "" -#: src/screens/SendConfirmScreen.js:236 +#: src/screens/SendConfirmScreen.js:266 msgid "This fee is fixed and required for every transfer of this token." msgstr "" #: src/components/Reown/NanoContract/NanoContractExecInfo.js:108 -#: src/screens/SendConfirmScreen.js:241 +#: src/screens/SendConfirmScreen.js:271 msgid "Loading..." msgstr "" -#: src/screens/SendConfirmScreen.js:263 +#: src/screens/SendConfirmScreen.js:293 msgid "Building your transaction" msgstr "" -#: src/screens/SendConfirmScreen.js:281 +#: src/screens/SendConfirmScreen.js:311 #, javascript-format msgid "Your transfer of **${ amountAndToken }** has been confirmed" msgstr "" -#: src/screens/SendConfirmScreen.js:292 +#: src/screens/SendConfirmScreen.js:322 msgid "Read more." msgstr "" -#: src/screens/SendConfirmScreen.js:309 +#: src/screens/SendConfirmScreen.js:344 msgid "**Transaction summary**" msgstr "" -#: src/screens/SendConfirmScreen.js:312 +#: src/screens/SendConfirmScreen.js:347 msgid "**To**" msgstr "" -#: src/screens/SendConfirmScreen.js:317 +#: src/screens/SendConfirmScreen.js:352 msgid "**Network Fee**" msgstr "" -#: src/screens/SendConfirmScreen.js:325 +#: src/screens/SendConfirmScreen.js:360 msgid "**Total**" msgstr "" #: src/screens/NetworkSettings/CustomNetworkSettingsScreen.js:295 -#: src/screens/SendConfirmScreen.js:332 +#: src/screens/SendConfirmScreen.js:367 msgid "Send" msgstr "" diff --git a/src/components/AmountTextInput.js b/src/components/AmountTextInput.js index a028ec3bf..77be27916 100644 --- a/src/components/AmountTextInput.js +++ b/src/components/AmountTextInput.js @@ -48,10 +48,19 @@ const AmountTextInput = forwardRef((props, ref) => { // Auto-shrink-to-fit: amounts can grow long enough to overflow the // input's column (e.g. `957,791,973.79`). We capture the column - // width once via the TextInput's `onLayout` and scale `fontSize` down + // width via the TextInput's `onLayout` and scale `fontSize` down // when the estimated text width (length × fontSize × GLYPH_RATIO) // exceeds it. When the user shortens the value, the estimate drops // and the font scales back up to the base size. + // + // IMPORTANT: `onLayout` measures this TextInput's OWN box, so callers + // MUST give it a parent-determined width — `flex: 1` when it shares a + // row (e.g. with a TokenBox), or `alignSelf: 'stretch'` / an explicit + // width when it sits alone in an `alignItems: 'center'` column. Without + // that the input sizes to its content; since `fontSize` (which this + // logic controls) also drives the content width, the measurement feeds + // back into itself and the font collapses to `minFontSize`, flickering + // on the way down. const [containerWidth, setContainerWidth] = useState(0); // Expose the focus method to parent components diff --git a/src/screens/CreateTokenConfirm.js b/src/screens/CreateTokenConfirm.js index ccaa1948c..6ca3c6a97 100644 --- a/src/screens/CreateTokenConfirm.js +++ b/src/screens/CreateTokenConfirm.js @@ -232,6 +232,11 @@ const CreateTokenConfirm = () => { editable={false} decimalPlaces={decimalPlaces} value={hathorLib.numberUtils.prettyValue(amount)} + // Stretch to the parent's width so the auto-shrink logic measures a + // fixed column width. The parent is `alignItems: 'center'`, so without + // this the input sizes to its content and the font-scaling feedback loop + // collapses the size. `textAlign: 'center'` keeps the value centered. + style={{ alignSelf: 'stretch' }} /> ( isTokenNFT(get(this.props, 'selectedToken.uid'), this.props.tokenMetadata) ) @@ -190,7 +201,7 @@ class MainScreen extends React.Component { ); } - if (status === 'loading') { + if (status === 'loading' || status === TOKEN_DOWNLOAD_STATUS.INVALIDATED) { return renderLoadingHistory(); } diff --git a/src/screens/SendConfirmScreen.js b/src/screens/SendConfirmScreen.js index 10158d14e..fc84a2969 100644 --- a/src/screens/SendConfirmScreen.js +++ b/src/screens/SendConfirmScreen.js @@ -44,10 +44,10 @@ function NoFee() { ); } -// Wallet-lib raises "No UTXOs available for the token ." when auto- -// selection can't cover the amount. HTR shortage gets its own message because, -// on FBT sends, it means insufficient HTR for the network fee. -function mapBuildError(err) { +// Translates wallet-lib error messages to user-friendly text. The UTXO +// patterns apply during build (auto-selection in prepare-tx); other errors +// (auth, signing, mining) fall through to the original lib message. +function mapTxError(err) { const msg = err?.message || ''; const htrUid = hathorLib.constants.NATIVE_TOKEN_UID; if (msg.includes(`No UTXOs available for the token ${htrUid}`)) { @@ -56,7 +56,7 @@ function mapBuildError(err) { if (msg.includes('No UTXOs available for the token')) { return t`Insufficient balance to send this transaction.`; } - return msg || t`Failed to build transaction.`; + return msg || t`Failed to process transaction.`; } const SendConfirmScreen = () => { @@ -80,6 +80,10 @@ const SendConfirmScreen = () => { const [buildError, setBuildError] = useState(null); const [modal, setModal] = useState(null); const [isTooltipShown, setIsTooltipShown] = useState(false); + // Disables the Send button from the moment it's tapped until the screen is + // interactive again, closing the window between the PinScreen dismissal and + // the feedback modal render where the button would otherwise be tappable. + const [isSending, setIsSending] = useState(false); const nativeSymbol = hathorLib.constants.DEFAULT_NATIVE_TOKEN_CONFIG.symbol; @@ -108,7 +112,7 @@ const SendConfirmScreen = () => { } catch (err) { if (cancelled) return; console.error(err); - setBuildError({ message: mapBuildError(err) }); + setBuildError({ message: mapTxError(err) }); setPhase(PHASE.ERROR); } })(); @@ -125,39 +129,65 @@ const SendConfirmScreen = () => { } }, [sendTx]); + // Re-enable the Send button whenever this screen regains focus. This covers + // the PinScreen being dismissed by cancel or hardware back (neither sets the + // feedback modal). + useEffect(() => { + const focusListener = navigation.addListener('focus', () => { + setIsSending(false); + }); + + return focusListener; + }, [navigation]); + const networkFee = phase === PHASE.READY && sendTx ? (sendTx.transaction.getFeeHeader()?.entries?.[0]?.amount ?? 0n) : null; /** - * Sign and broadcast the pre-built transaction. Failures transition - * the flow to PHASE.ERROR. + * Sign and mine the pre-built transaction. + * Returns the in-flight promise so the feedback modal can subscribe to it. + * Any error along the path is mapped to user-friendly text before rejecting. * * @param {string} pin Validated user PIN + * @returns {Promise} */ - const executeSend = async (pin) => { + const signAndSendTx = async (pin) => { try { if (useWalletService) { await wallet.validateAndRenewAuthToken(pin); } await wallet.signTx(sendTx.transaction, { pinCode: pin }); - const promise = sendTx.runFromMining(); - setModal({ - text: t`Your transfer is being processed`, - sendTransaction: sendTx, - promise, - }); + return await sendTx.runFromMining(); } catch (err) { console.error(err); - setBuildError({ message: mapBuildError(err) }); - setPhase(PHASE.ERROR); + throw new Error(mapTxError(err)); } }; + /** + * Called after PIN validation. Hands the running signAndSendTx promise to + * the feedback modal — setModal is synchronous so the modal renders in the + * same commit as the PinScreen dismissal, closing the window where the + * Send button could be tapped again. + * + * @param {string} pin Validated user PIN + */ + const executeSend = (pin) => { + setModal({ + text: t`Your transfer is being processed`, + sendTransaction: sendTx, + promise: signAndSendTx(pin), + }); + }; + /** * Executed when user clicks to send the tx and opens PIN screen */ const onSendPress = () => { + // Disable the button before opening the PinScreen so it can't be tapped + // again while we return from it and build the feedback modal. + setIsSending(true); const pinParams = { cb: executeSend, canCancel: true, @@ -300,6 +330,11 @@ const SendConfirmScreen = () => { {getAvailableString()} @@ -331,8 +366,9 @@ const SendConfirmScreen = () => { )} diff --git a/src/screens/Settings.js b/src/screens/Settings.js index 1ae896708..1af9644bf 100644 --- a/src/screens/Settings.js +++ b/src/screens/Settings.js @@ -166,7 +166,7 @@ export class Settings extends React.Component { onPress={() => this.props.navigation.navigate(NetworkSettingsFlowNav)} /> )} - {this.props.reownEnabled + {this.props.singleAddressEnabled && ( Date: Fri, 29 May 2026 12:04:36 -0300 Subject: [PATCH 5/8] chore: bump to v0.39.0-rc.3 (#879) --- android/app/build.gradle | 4 ++-- ios/HathorMobile.xcodeproj/project.pbxproj | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 761605e0c..99ef63bda 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -84,8 +84,8 @@ android { applicationId "network.hathor.wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 126 - versionName "0.39.0-rc.2" + versionCode 127 + versionName "0.39.0-rc.3" missingDimensionStrategy "react-native-camera", "general" } diff --git a/ios/HathorMobile.xcodeproj/project.pbxproj b/ios/HathorMobile.xcodeproj/project.pbxproj index f20816935..079be5385 100644 --- a/ios/HathorMobile.xcodeproj/project.pbxproj +++ b/ios/HathorMobile.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.2.0; + CURRENT_PROJECT_VERSION = 0.3.0; DEVELOPMENT_TEAM = 55SHY647CG; ENABLE_BITCODE = NO; INFOPLIST_FILE = HathorMobile/Info.plist; @@ -457,7 +457,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.2.0; + CURRENT_PROJECT_VERSION = 0.3.0; DEVELOPMENT_TEAM = 55SHY647CG; INFOPLIST_FILE = HathorMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; diff --git a/package-lock.json b/package-lock.json index e3be967da..442862537 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.2", + "version": "0.39.0-rc.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "HathorMobile", - "version": "0.39.0-rc.2", + "version": "0.39.0-rc.3", "dependencies": { "@ethersproject/shims": "5.7.0", "@fortawesome/fontawesome-svg-core": "6.7.2", diff --git a/package.json b/package.json index 81376d0bf..f7a3e27e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.2", + "version": "0.39.0-rc.3", "engines": { "node": ">=18.0.0", "npm": ">=10.0.0" From c2569c086e535b24a633ca500b04ee6930f2feb4 Mon Sep 17 00:00:00 2001 From: Raul Oliveira <38788084+raul-oliveira@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:36:19 -0300 Subject: [PATCH 6/8] fix: strip bigint balance from token snapshot (#881) --- src/sagas/tokens.js | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/sagas/tokens.js b/src/sagas/tokens.js index 51505aeee..63053b4a7 100644 --- a/src/sagas/tokens.js +++ b/src/sagas/tokens.js @@ -474,6 +474,37 @@ function getGenesisHash(serverInfo) { return serverInfo?.genesis_block_hash || null; } +/** + * Token config fields (ITokenData) that are persisted in the network snapshot. + * Everything else returned by `getRegisteredTokens` is wallet metadata + * (ITokenMetadata: `numTransactions` and a `bigint` `balance`) that is + * recomputed/re-fetched once the wallet syncs on the destination network, so it + * must not be persisted. Keeping it out also stops `bigint` balances from being + * written to AsyncStorage. + */ +const SNAPSHOT_TOKEN_CONFIG_FIELDS = ['uid', 'name', 'symbol', 'version']; + +/** + * Strip wallet metadata from a registered tokens map, keeping only the token + * config fields. + * + * @param {Object} tokens Registered tokens map keyed by uid + * @returns {Object} Tokens map with only config fields per token + */ +function stripTokenMetadata(tokens) { + const tokenConfigs = {}; + for (const [uid, token] of Object.entries(tokens)) { + const config = {}; + for (const field of SNAPSHOT_TOKEN_CONFIG_FIELDS) { + if (token[field] !== undefined) { + config[field] = token[field]; + } + } + tokenConfigs[uid] = config; + } + return tokenConfigs; +} + /** * Persist the current registered tokens (excluding HTR) to storage * keyed by the current network's genesis hash. @@ -487,7 +518,8 @@ function* persistTokensForCurrentNetwork() { if (!wallet) return; const tokens = yield call(getRegisteredTokens, wallet, true); - yield call([STORE, STORE.saveTokensForNetwork], genesisHash, tokens); + const tokenConfigs = stripTokenMetadata(tokens); + yield call([STORE, STORE.saveTokensForNetwork], genesisHash, tokenConfigs); } /** From 7e754ad5d4f440f7cc19820bbd96245b18e1bb57 Mon Sep 17 00:00:00 2001 From: Raul Oliveira <38788084+raul-oliveira@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:47:08 -0300 Subject: [PATCH 7/8] chore: bump package to 0.39.0-rc.4 (#882) --- android/app/build.gradle | 4 ++-- ios/HathorMobile.xcodeproj/project.pbxproj | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 99ef63bda..8d41936ac 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -84,8 +84,8 @@ android { applicationId "network.hathor.wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 127 - versionName "0.39.0-rc.3" + versionCode 128 + versionName "0.39.0-rc.4" missingDimensionStrategy "react-native-camera", "general" } diff --git a/ios/HathorMobile.xcodeproj/project.pbxproj b/ios/HathorMobile.xcodeproj/project.pbxproj index 079be5385..ac5735363 100644 --- a/ios/HathorMobile.xcodeproj/project.pbxproj +++ b/ios/HathorMobile.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.3.0; + CURRENT_PROJECT_VERSION = 0.4.0; DEVELOPMENT_TEAM = 55SHY647CG; ENABLE_BITCODE = NO; INFOPLIST_FILE = HathorMobile/Info.plist; @@ -457,7 +457,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.3.0; + CURRENT_PROJECT_VERSION = 0.4.0; DEVELOPMENT_TEAM = 55SHY647CG; INFOPLIST_FILE = HathorMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; diff --git a/package-lock.json b/package-lock.json index 442862537..9ef15beb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.3", + "version": "0.39.0-rc.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "HathorMobile", - "version": "0.39.0-rc.3", + "version": "0.39.0-rc.4", "dependencies": { "@ethersproject/shims": "5.7.0", "@fortawesome/fontawesome-svg-core": "6.7.2", diff --git a/package.json b/package.json index f7a3e27e5..5fa1495c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.3", + "version": "0.39.0-rc.4", "engines": { "node": ">=18.0.0", "npm": ">=10.0.0" From dc10dde9a126be2f35e10442576bc3db5c8ffbd5 Mon Sep 17 00:00:00 2001 From: Tulio Miranda Date: Thu, 11 Jun 2026 11:24:12 -0300 Subject: [PATCH 8/8] chore: bump version to 0.39.0 (#887) --- android/app/build.gradle | 4 ++-- ios/HathorMobile.xcodeproj/project.pbxproj | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 8d41936ac..a8566d95f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -84,8 +84,8 @@ android { applicationId "network.hathor.wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 128 - versionName "0.39.0-rc.4" + versionCode 129 + versionName "0.39.0" missingDimensionStrategy "react-native-camera", "general" } diff --git a/ios/HathorMobile.xcodeproj/project.pbxproj b/ios/HathorMobile.xcodeproj/project.pbxproj index ac5735363..e31c73f92 100644 --- a/ios/HathorMobile.xcodeproj/project.pbxproj +++ b/ios/HathorMobile.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.4.0; + CURRENT_PROJECT_VERSION = 1.0.0; DEVELOPMENT_TEAM = 55SHY647CG; ENABLE_BITCODE = NO; INFOPLIST_FILE = HathorMobile/Info.plist; @@ -457,7 +457,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HathorMobile/HathorMobile.entitlements; - CURRENT_PROJECT_VERSION = 0.4.0; + CURRENT_PROJECT_VERSION = 1.0.0; DEVELOPMENT_TEAM = 55SHY647CG; INFOPLIST_FILE = HathorMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; diff --git a/package-lock.json b/package-lock.json index 9ef15beb3..a77555a62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.4", + "version": "0.39.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "HathorMobile", - "version": "0.39.0-rc.4", + "version": "0.39.0", "dependencies": { "@ethersproject/shims": "5.7.0", "@fortawesome/fontawesome-svg-core": "6.7.2", diff --git a/package.json b/package.json index 5fa1495c4..aead47169 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "HathorMobile", - "version": "0.39.0-rc.4", + "version": "0.39.0", "engines": { "node": ">=18.0.0", "npm": ">=10.0.0"