From 32f587737462682d65ebfe75fc7b6c0ae684e505 Mon Sep 17 00:00:00 2001 From: Dmitriy Kudasov Date: Wed, 14 Aug 2024 11:08:13 +0300 Subject: [PATCH 1/3] fix(HW-593): Fix chainId calculations for json rpc sign --- src/components/json-rpc-transaction-info.tsx | 31 ++++++++++--------- .../on-wallet-connect-sign-transaction.ts | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/components/json-rpc-transaction-info.tsx b/src/components/json-rpc-transaction-info.tsx index 85063e107..43cac488f 100644 --- a/src/components/json-rpc-transaction-info.tsx +++ b/src/components/json-rpc-transaction-info.tsx @@ -69,11 +69,10 @@ export const JsonRpcTransactionInfo = ({ ); const provider = useMemo(() => { - const _provider = Provider.getByEthChainId( - chainId || tx?.chainId || app.provider.ethChainId, + return Provider.getByEthChainId( + tx?.chainId ?? chainId ?? app.provider.ethChainId, ); - return _provider!; - }, [chainId]); + }, [chainId, tx]); const url = useMemo(() => getHostnameFromUrl(metadata?.url), [metadata]); @@ -82,8 +81,8 @@ export const JsonRpcTransactionInfo = ({ return Balance.Empty; } - return new Balance(tx.value); - }, [tx]); + return new Balance(tx.value, provider?.decimals, provider?.denom); + }, [tx, provider]); const calculateFee = useCallback(async () => { if (!tx) { @@ -94,7 +93,11 @@ export const JsonRpcTransactionInfo = ({ const data = await EthNetwork.estimate({ from: tx.from!, to: tx.to!, - value: new Balance(tx.value! || Balance.Empty), + value: new Balance( + tx.value! || Balance.Empty, + provider?.decimals, + provider?.denom, + ), data: tx.data, }); setFee(new Fee(data)); @@ -169,12 +172,16 @@ export const JsonRpcTransactionInfo = ({ fee, from: tx.from!, to: tx.to!, - value: new Balance(tx.value! || Balance.Empty), + value: new Balance( + tx.value! || Balance.Empty, + provider?.decimals, + provider?.denom, + ), data: tx.data, }); setFee(result); } - }, [navigation, tx, fee]); + }, [navigation, tx, fee, provider]); return ( @@ -260,11 +267,7 @@ export const JsonRpcTransactionInfo = ({ - {' '} - + {`${provider?.coinName} ${provider?.denom}`} {!!provider?.id && ( diff --git a/src/event-actions/on-wallet-connect-sign-transaction.ts b/src/event-actions/on-wallet-connect-sign-transaction.ts index 671ac8605..203ca3cd7 100644 --- a/src/event-actions/on-wallet-connect-sign-transaction.ts +++ b/src/event-actions/on-wallet-connect-sign-transaction.ts @@ -89,7 +89,7 @@ export async function onWalletConnectSignTransaction( const chainIdFromParams = event?.params?.chainId?.split?.(':')?.[1]; const result = await awaitForJsonRpcSign({ - chainId: Number(chainId || chainIdFromParams), + chainId: Number(chainIdFromParams || chainId), request: event.params?.request, metadata: { url: session.peer.metadata.url, From 10b0e8fb5cbe7c2f3606c460e54b9d6a942a06f5 Mon Sep 17 00:00:00 2001 From: Dmitriy Kudasov Date: Wed, 14 Aug 2024 11:31:28 +0300 Subject: [PATCH 2/3] Fix fee calculation for json-rpc-sign --- src/components/json-rpc-transaction-info.tsx | 44 ++++++++++--------- src/services/eth-network/eth-network.ts | 3 +- .../json-rpc-methods-handlers.ts | 2 - src/services/provider-sss-initialize.ts | 1 - src/services/provider-sss.ts | 3 +- src/services/push-notifications.ts | 2 - 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/components/json-rpc-transaction-info.tsx b/src/components/json-rpc-transaction-info.tsx index 43cac488f..43b4ba248 100644 --- a/src/components/json-rpc-transaction-info.tsx +++ b/src/components/json-rpc-transaction-info.tsx @@ -1,6 +1,7 @@ import React, {useCallback, useMemo, useState} from 'react'; import {ActivityIndicator, ScrollView, View} from 'react-native'; +import {TouchableWithoutFeedback} from 'react-native-gesture-handler'; import {Color} from '@app/colors'; import { @@ -19,7 +20,7 @@ import {awaitForFee} from '@app/helpers/await-for-fee'; import {useTypedNavigation} from '@app/hooks'; import {useEffectAsync} from '@app/hooks/use-effect-async'; import {I18N} from '@app/i18n'; -import {Fee} from '@app/models/fee'; +import {EstimationVariant, Fee} from '@app/models/fee'; import {Provider} from '@app/models/provider'; import {JsonRpcSignPopupStackParamList} from '@app/route-types'; import {EthNetwork} from '@app/services'; @@ -90,16 +91,20 @@ export const JsonRpcTransactionInfo = ({ } try { - const data = await EthNetwork.estimate({ - from: tx.from!, - to: tx.to!, - value: new Balance( - tx.value! || Balance.Empty, - provider?.decimals, - provider?.denom, - ), - data: tx.data, - }); + const data = await EthNetwork.estimate( + { + from: tx.from!, + to: tx.to!, + value: new Balance( + tx.value || Balance.Empty, + provider?.decimals, + provider?.denom, + ), + data: tx.data, + }, + EstimationVariant.average, + provider, + ); setFee(new Fee(data)); return data.expectedFee; } catch { @@ -287,15 +292,14 @@ export const JsonRpcTransactionInfo = ({ {isFeeLoading && } - - - {fee?.expectedFeeString} - - - + + + + {fee?.expectedFeeString} + + + + diff --git a/src/services/eth-network/eth-network.ts b/src/services/eth-network/eth-network.ts index 2a700f0fc..e710c0860 100644 --- a/src/services/eth-network/eth-network.ts +++ b/src/services/eth-network/eth-network.ts @@ -191,9 +191,10 @@ export class EthNetwork { static async estimate( {from, to, value = Balance.Empty, data = '0x', minGas}: TxEstimationParams, calculationType: EstimationVariant = EstimationVariant.average, + provider = app.provider, ): Promise { try { - const rpcProvider = await getRpcProvider(app.provider); + const rpcProvider = await getRpcProvider(provider); const {maxFeePerGas, maxPriorityFeePerGas} = await rpcProvider.getFeeData(); const block = await rpcProvider.getBlock('latest'); diff --git a/src/services/json-rpc-middleware/json-rpc-methods-handlers.ts b/src/services/json-rpc-middleware/json-rpc-methods-handlers.ts index 37beb5a3b..d10acf596 100644 --- a/src/services/json-rpc-middleware/json-rpc-methods-handlers.ts +++ b/src/services/json-rpc-middleware/json-rpc-methods-handlers.ts @@ -600,8 +600,6 @@ export const JsonRpcMethodsHandlers: Record = { hexSignature = hexSignature.slice(0, 128); } - Logger.log('account.base_account.pub_key', account.base_account.pub_key); - return { signature: { pub_key: account.base_account.pub_key, diff --git a/src/services/provider-sss-initialize.ts b/src/services/provider-sss-initialize.ts index 105cc889c..8ec98155d 100644 --- a/src/services/provider-sss-initialize.ts +++ b/src/services/provider-sss-initialize.ts @@ -47,7 +47,6 @@ export async function providerSssInitialize( } if (socialPrivateKey) { - // Logger.log('socialPrivateKey', socialPrivateKey); const socialShareIndex = await getMetadataValueWrapped( options.metadataUrl, socialPrivateKey, diff --git a/src/services/provider-sss.ts b/src/services/provider-sss.ts index acd3b0675..512963bf9 100644 --- a/src/services/provider-sss.ts +++ b/src/services/provider-sss.ts @@ -62,14 +62,13 @@ export async function onLoginGoogle() { try { authState = await getGoogleTokens(); } catch (err) { - // Logger.log('SSS_GOOGLE_ERROR', err); + Logger.log('SSS_GOOGLE_ERROR', err); } const authInfo = parseJwt(authState.idToken); const verifier = RemoteConfig.get('sss_google_provider'); if (!verifier) { - // Logger.log('SSS_GOOGLE_ERROR', 'sss_google is not set'); throw new Error('sss_google is not set'); } diff --git a/src/services/push-notifications.ts b/src/services/push-notifications.ts index ba5400008..28ffc05c4 100644 --- a/src/services/push-notifications.ts +++ b/src/services/push-notifications.ts @@ -29,12 +29,10 @@ export class PushNotifications extends EventEmitter { super(); messaging().onMessage(remoteMessage => { - // Logger.log('onMessage', remoteMessage); app.emit(Events.onPushNotification, remoteMessage); }); messaging().onNotificationOpenedApp(remoteMessage => { - // Logger.log('onNotificationOpenedApp', remoteMessage); app.emit(Events.onPushNotification, remoteMessage); }); From 0980b5758180933725dda75a71832233129fdda9 Mon Sep 17 00:00:00 2001 From: Dmitriy Kudasov Date: Wed, 14 Aug 2024 12:18:55 +0300 Subject: [PATCH 3/3] fix(HW-593): fee calculation and rpc sign methods --- src/components/json-rpc-transaction-info.tsx | 1 + .../TransactionStack/fee-settings.tsx | 5 ++- src/services/eth-network/eth-network.ts | 41 +++++++++++++++---- src/services/sign-json-rpc-request.ts | 22 ++++++---- 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/components/json-rpc-transaction-info.tsx b/src/components/json-rpc-transaction-info.tsx index 43b4ba248..223b4a228 100644 --- a/src/components/json-rpc-transaction-info.tsx +++ b/src/components/json-rpc-transaction-info.tsx @@ -183,6 +183,7 @@ export const JsonRpcTransactionInfo = ({ provider?.denom, ), data: tx.data, + chainId: provider?.ethChainId ? String(provider.ethChainId) : undefined, }); setFee(result); } diff --git a/src/screens/HomeStack/TransactionStack/fee-settings.tsx b/src/screens/HomeStack/TransactionStack/fee-settings.tsx index 7978e19e6..7e6465db3 100644 --- a/src/screens/HomeStack/TransactionStack/fee-settings.tsx +++ b/src/screens/HomeStack/TransactionStack/fee-settings.tsx @@ -23,6 +23,7 @@ import {createTheme} from '@app/helpers'; import {useSumAmount, useTypedNavigation, useTypedRoute} from '@app/hooks'; import {I18N, getText} from '@app/i18n'; import {EstimationVariant, Fee} from '@app/models/fee'; +import {Provider} from '@app/models/provider'; import {HomeStackParamList, HomeStackRoutes} from '@app/route-types'; import {EthNetwork} from '@app/services'; import {Balance} from '@app/services/balance'; @@ -38,7 +39,7 @@ type ResetValues = { export const FeeSettingsScreen = observer(() => { const navigation = useTypedNavigation(); - const {fee, from, to, value, data, successEventName} = useTypedRoute< + const {fee, from, to, value, data, successEventName, chainId} = useTypedRoute< HomeStackParamList, HomeStackRoutes.FeeSettings >().params; @@ -81,6 +82,7 @@ export const FeeSettingsScreen = observer(() => { new Balance(amountsMaxPriorityFee.amount).toWei(), ), }, + Provider.getByEthChainId(chainId!), ); calculatedData && setExpectedFee(calculatedData.expectedFee); @@ -95,6 +97,7 @@ export const FeeSettingsScreen = observer(() => { data, }, estimationType, + Provider.getByEthChainId(chainId!), ); setResetValues({ diff --git a/src/services/eth-network/eth-network.ts b/src/services/eth-network/eth-network.ts index e710c0860..369828bb0 100644 --- a/src/services/eth-network/eth-network.ts +++ b/src/services/eth-network/eth-network.ts @@ -137,9 +137,10 @@ export class EthNetwork { static async customEstimate( {from, to, value = Balance.Empty, data = '0x'}: TxEstimationParams, {gasLimit, maxBaseFee, maxPriorityFee}: TxCustomEstimationParams, + provider = app.provider, ): Promise { try { - const rpcProvider = await getRpcProvider(app.provider); + const rpcProvider = await getRpcProvider(provider); const block = await rpcProvider.getBlock('latest'); const estimateGasLimit = await rpcProvider.estimateGas({ from, @@ -159,11 +160,25 @@ export class EthNetwork { } return { - gasLimit: new Balance(resultGasLimit), - maxBaseFee: new Balance(resultMaxBaseFee), - maxPriorityFee: new Balance(maxPriorityFee), + gasLimit: new Balance( + resultGasLimit, + provider.decimals, + provider.denom, + ), + maxBaseFee: new Balance( + resultMaxBaseFee, + provider.decimals, + provider.denom, + ), + maxPriorityFee: new Balance( + maxPriorityFee, + provider.decimals, + provider.denom, + ), expectedFee: new Balance( resultGasLimit.mul(resultMaxBaseFee.add(maxPriorityFee)), + provider.decimals, + provider.denom, ), }; } catch (error) { @@ -240,10 +255,20 @@ export class EthNetwork { } return { - gasLimit: new Balance(gasLimit).max(minGas), - maxBaseFee: new Balance(maxBaseFee), - maxPriorityFee: new Balance(priorityFee), - expectedFee: new Balance(gasLimit.mul(maxBaseFee.add(priorityFee))), + gasLimit: new Balance(gasLimit, provider.decimals, provider.denom).max( + minGas, + ), + maxBaseFee: new Balance(maxBaseFee, provider.decimals, provider.denom), + maxPriorityFee: new Balance( + priorityFee, + provider.decimals, + provider.denom, + ), + expectedFee: new Balance( + gasLimit.mul(maxBaseFee.add(priorityFee)), + provider.decimals, + provider.denom, + ), }; } catch (error) { Logger.captureException(error, 'EthNetwork.estimateTransaction error'); diff --git a/src/services/sign-json-rpc-request.ts b/src/services/sign-json-rpc-request.ts index cd40e4d8c..142bf3b04 100644 --- a/src/services/sign-json-rpc-request.ts +++ b/src/services/sign-json-rpc-request.ts @@ -7,6 +7,7 @@ import {DEBUG_VARS} from '@app/debug-vars'; import {getProviderInstanceForWallet, hideModal} from '@app/helpers'; import {getRpcProvider} from '@app/helpers/get-rpc-provider'; import {I18N, getText} from '@app/i18n'; +import {EstimationVariant} from '@app/models/fee'; import {Provider} from '@app/models/provider'; import {Wallet} from '@app/models/wallet'; import {getDefaultNetwork} from '@app/network'; @@ -105,7 +106,6 @@ export class SignJsonRpcRequest { } const provider = Provider.getByEthChainId(chainId!) || app.provider; - const rpcProvider = provider ? await getRpcProvider(provider) : getDefaultNetwork(); @@ -170,13 +170,19 @@ export class SignJsonRpcRequest { const minGas = new Balance(signTransactionRequest.gasLimit ?? 0); const {gasLimit, maxBaseFee, maxPriorityFee} = - await EthNetwork.estimate({ - from: signTransactionRequest.from!, - to: signTransactionRequest.to!, - value: new Balance(signTransactionRequest.value! || Balance.Empty), - data: signTransactionRequest.data?.toString()!, - minGas, - }); + await EthNetwork.estimate( + { + from: signTransactionRequest.from!, + to: signTransactionRequest.to!, + value: new Balance( + signTransactionRequest.value! || Balance.Empty, + ), + data: signTransactionRequest.data?.toString()!, + minGas, + }, + EstimationVariant.average, + provider, + ); const maxPriorityFeePerGasCalculated = maxPriorityFee.max( signTransactionRequest.maxPriorityFeePerGas || 0,