diff --git a/VERSION_CODE b/VERSION_CODE index 55596b29f..1e3852840 100644 --- a/VERSION_CODE +++ b/VERSION_CODE @@ -1 +1 @@ -210 \ No newline at end of file +211 \ No newline at end of file diff --git a/app/engine/hooks/jettons/useJetton.ts b/app/engine/hooks/jettons/useJetton.ts index 7cb4a1723..179ea749e 100644 --- a/app/engine/hooks/jettons/useJetton.ts +++ b/app/engine/hooks/jettons/useJetton.ts @@ -48,7 +48,7 @@ export function useJetton(params: { owner: Address | string, master?: Address | symbol, description, decimals: content.decimals ?? null, - icon: content.image?.preview256 ?? null, + icon: content.image?.preview256 || content.originalImage || null, disabled: false, assets: !!content.assets ? [content.assets[0], content.assets[1]] : null, pool: content.pool, diff --git a/app/fragments/secure/SimpleTransferFragment.tsx b/app/fragments/secure/SimpleTransferFragment.tsx index 5570055c7..37fc0e316 100644 --- a/app/fragments/secure/SimpleTransferFragment.tsx +++ b/app/fragments/secure/SimpleTransferFragment.tsx @@ -360,6 +360,8 @@ export const SimpleTransferFragment = fragment(() => { }, [validAmount, target, domain, commentString, stateInit, jettonState, params?.app, acc, ledgerAddress, known, jettonPayload]); const walletVersion = useWalletVersion(); + const isV5 = walletVersion === WalletVersions.v5R1; + const supportsGaslessTransfer = hasGaslessTransfer && isV5; // Estimate fee const config = useConfig(); @@ -456,7 +458,6 @@ export const SimpleTransferFragment = fragment(() => { // Load contract const pubKey = ledgerContext.addr?.publicKey ?? currentAcc.publicKey; const contract = await contractFromPublicKey(pubKey, walletVersion, network.isTestnet); - const isV5 = walletVersion === WalletVersions.v5R1; const transferParams = { seqno: seqno, @@ -474,8 +475,6 @@ export const SimpleTransferFragment = fragment(() => { return; } - const supportsGaslessTransfer = hasGaslessTransfer && isV5; - // Resolve fee if (config && accountLite && !supportsGaslessTransfer) { const externalMessage = external({ @@ -502,7 +501,7 @@ export const SimpleTransferFragment = fragment(() => { return () => { ended = true; } - }, [order, accountLite, client, config, commentString, ledgerAddress, walletVersion, hasGaslessTransfer, jettonPayload?.customPayload, jettonPayload?.stateInit]); + }, [order, accountLite, client, config, commentString, ledgerAddress, walletVersion, supportsGaslessTransfer, jettonPayload?.customPayload, jettonPayload?.stateInit]); const linkNavigator = useLinkNavigator(network.isTestnet); const onQRCodeRead = useCallback((src: string) => { @@ -701,7 +700,8 @@ export const SimpleTransferFragment = fragment(() => { order: order as Order, job: params && params.job ? params.job : null, callback, - back: params && params.back ? params.back + 1 : undefined + back: params && params.back ? params.back + 1 : undefined, + useGasless: supportsGaslessTransfer }); }, [ amount, target, domain, commentString, @@ -712,7 +712,8 @@ export const SimpleTransferFragment = fragment(() => { jettonState, ledgerAddress, isLedger, - balance + balance, + supportsGaslessTransfer ]); const onFocus = useCallback((index: number) => { diff --git a/app/fragments/secure/TransferFragment.tsx b/app/fragments/secure/TransferFragment.tsx index 6b6d2d719..defa50ba1 100644 --- a/app/fragments/secure/TransferFragment.tsx +++ b/app/fragments/secure/TransferFragment.tsx @@ -52,7 +52,8 @@ export type TransferFragmentProps = { order: Order, job: string | null, callback?: ((ok: boolean, result: Cell | null) => void) | null, - back?: number + back?: number, + useGasless?: boolean }; export type OrderMessage = { @@ -176,7 +177,7 @@ export const TransferFragment = fragment(() => { const job = useMemo(() => params.job, []); const callback = useMemo(() => params.callback, []); - const [useGasless, setUseGasless] = useState(true); + const [useGasless, setUseGasless] = useState(params.useGasless ?? false); const handleReturnStrategy = useCallback((returnStrategy: string) => { if (returnStrategy === 'back') { @@ -230,13 +231,36 @@ export const TransferFragment = fragment(() => { // Fetch all required parameters const [loadedProps, setLoadedProps] = useState(null); - const onError = useCallback(({ message, title }: { message?: string, title: string }) => { + const onError = useCallback(({ message, title, gaslessEstimate }: { message?: string, title: string, gaslessEstimate?: boolean }) => { if (finished.current) { return; } finished.current = true; + if (gaslessEstimate) { + Alert.alert(title, message, + [{ + text: t('common.back'), + onPress: () => { + if (params.back && params.back > 0) { + for (let i = 0; i < params.back; i++) { + navigation.goBack(); + } + } else { + navigation.goBack(); + } + } + }, + { + text: t('transfer.error.gaslessCooldownPayTon'), + onPress: () => onSetUseGasless?.(false) + }] + ); + + return; + } + Alert.alert(title, message, [{ text: t('common.back'), @@ -436,7 +460,7 @@ export const TransferFragment = fragment(() => { ) { throw Error('Error resolving wallet address'); } - } catch (e) { + } catch { onError({ title: t('transfer.error.invalidDomain') }); return; } @@ -575,18 +599,21 @@ export const TransferFragment = fragment(() => { if (gaslessEstimate.error === 'not-enough') { onError({ title: t('transfer.error.gaslessNotEnoughFunds'), - message: t('transfer.error.gaslessNotEnoughFundsMessage') + message: t('transfer.error.gaslessNotEnoughFundsMessage'), + gaslessEstimate: true }); } else if (gaslessEstimate.error === 'try-later') { onError({ title: t('transfer.error.gaslessTryLater'), - message: t('transfer.error.gaslessTryLaterMessage') + message: t('transfer.error.gaslessTryLaterMessage'), + gaslessEstimate: true }); } else { warn(`Gasless estimate failed: ${gaslessEstimate.error}`); onError({ title: t('transfer.error.gaslessFailed'), - message: t('transfer.error.gaslessFailedEstimate') + message: t('transfer.error.gaslessFailedEstimate'), + gaslessEstimate: true }); } return; diff --git a/assets/jettons/knownJettons.json b/assets/jettons/knownJettons.json index 7f0a517e9..affba6f33 100644 --- a/assets/jettons/knownJettons.json +++ b/assets/jettons/knownJettons.json @@ -10,12 +10,16 @@ "tickers": [ "TON", "USDT", - "USD₮" + "USD₮", + "HMSTR", + "NOT" ], "specialJetton": "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs", "masters": { "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs": {}, - "EQD0laik0FgHV8aNfRhebi8GDG2rpDyKGXem0MBfya_Ew1-8": {} + "EQD0laik0FgHV8aNfRhebi8GDG2rpDyKGXem0MBfya_Ew1-8": {}, + "EQAJ8uWd7EBqsmpSWaRdf_I-8R8-XHwh3gsNKhy-UrdrPcUo": {}, + "EQAvlWFDxGF2lXm67y4yzC17wYKD9A0guwPkMs1gOsM__NOT": {} } } } \ No newline at end of file diff --git a/ios/wallet/Info.plist b/ios/wallet/Info.plist index 6b0f7c7d6..a9c1adbab 100644 --- a/ios/wallet/Info.plist +++ b/ios/wallet/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 2.3.16 + 2.3.17 CFBundleSignature ???? CFBundleURLTypes @@ -41,7 +41,7 @@ CFBundleVersion - 210 + 211 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index a8bd755cb..976d8969c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wallet", - "version": "2.3.16", + "version": "2.3.17", "scripts": { "start": "expo start --dev-client", "android": "expo run:android",