diff --git a/e2e/9_swaps.spec.ts b/e2e/9_swaps.spec.ts
index f899fbdc68f..4655c019275 100644
--- a/e2e/9_swaps.spec.ts
+++ b/e2e/9_swaps.spec.ts
@@ -20,10 +20,8 @@ import {
afterAllcleanApp,
fetchElementAttributes,
tap,
- tapByText,
delayTime,
swipeUntilVisible,
- tapAndLongPressByText,
tapAndLongPress,
swipe,
} from './helpers';
@@ -69,10 +67,11 @@ describe('Swap Sheet Interaction Flow', () => {
await tap('token-to-buy-dai-1');
await delayTime('medium');
+
const swapInput = await fetchElementAttributes('swap-asset-input');
- expect(swapInput.label).toContain('ETH');
expect(swapInput.label).toContain('10');
+ expect(swapInput.label).toContain('ETH');
});
it('Should be able to go to review and execute a swap', async () => {
diff --git a/e2e/helpers.ts b/e2e/helpers.ts
index dd82d8f2754..7ecb9811fc3 100644
--- a/e2e/helpers.ts
+++ b/e2e/helpers.ts
@@ -472,6 +472,11 @@ export async function sendETHtoTestWallet() {
to: TESTING_WALLET,
value: parseEther('20'),
});
+ await delayTime('long');
+ const balance = await provider.getBalance(TESTING_WALLET);
+ if (balance.lt(parseEther('20'))) {
+ throw Error('Error sending ETH to test wallet');
+ }
return true;
}
diff --git a/src/__swaps__/screens/Swap/components/SwapActionButton.tsx b/src/__swaps__/screens/Swap/components/SwapActionButton.tsx
index a6a8d913966..4530a28db5d 100644
--- a/src/__swaps__/screens/Swap/components/SwapActionButton.tsx
+++ b/src/__swaps__/screens/Swap/components/SwapActionButton.tsx
@@ -139,7 +139,14 @@ function SwapButton({
)}
{typeof label !== 'undefined' && (
-
+
{labelValue}
diff --git a/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts b/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts
index a2d181c9a08..53efd2f9cc1 100644
--- a/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts
+++ b/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts
@@ -10,7 +10,7 @@ import { useUserAssets } from '@/__swaps__/screens/Swap/resources/assets';
import { ParsedAssetsDictByChain, ParsedSearchAsset, UserAssetFilter } from '@/__swaps__/types/assets';
import { useAccountSettings, useDebounce } from '@/hooks';
import { userAssetsStore } from '@/state/assets/userAssets';
-import { getIsHardhatConnected } from '@/handlers/web3';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
const sortBy = (by: UserAssetFilter) => {
switch (by) {
@@ -22,15 +22,15 @@ const sortBy = (by: UserAssetFilter) => {
};
export const useAssetsToSell = () => {
- const { accountAddress: currentAddress, nativeCurrency: currentCurrency, network: currentNetwork } = useAccountSettings();
-
- const connectedToHardhat = getIsHardhatConnected();
+ const { accountAddress: currentAddress, nativeCurrency: currentCurrency } = useAccountSettings();
const filter = userAssetsStore(state => state.filter);
const searchQuery = userAssetsStore(state => state.inputSearchQuery);
const debouncedAssetToSellFilter = useDebounce(searchQuery, 200);
+ const { connectedToHardhat } = useConnectedToHardhatStore();
+
const { data: userAssets = [] } = useUserAssets(
{
address: currentAddress as Address,
diff --git a/src/__swaps__/screens/Swap/providers/swap-provider.tsx b/src/__swaps__/screens/Swap/providers/swap-provider.tsx
index 917e3ee5fa2..7c069fc1a20 100644
--- a/src/__swaps__/screens/Swap/providers/swap-provider.tsx
+++ b/src/__swaps__/screens/Swap/providers/swap-provider.tsx
@@ -29,7 +29,7 @@ import { SwapAssetType, inputKeys } from '@/__swaps__/types/swap';
import { getDefaultSlippageWorklet, isUnwrapEthWorklet, isWrapEthWorklet, parseAssetAndExtend } from '@/__swaps__/utils/swaps';
import { analyticsV2 } from '@/analytics';
import { LegacyTransactionGasParamAmounts, TransactionGasParamAmounts } from '@/entities';
-import { getFlashbotsProvider, getIsHardhatConnected, getProvider, isHardHat } from '@/handlers/web3';
+import { getFlashbotsProvider, getProvider } from '@/handlers/web3';
import { WrappedAlert as Alert } from '@/helpers/alert';
import { useAccountSettings } from '@/hooks';
import { useAnimatedInterval } from '@/hooks/reanimated/useAnimatedInterval';
@@ -56,6 +56,7 @@ import { useSwapOutputQuotesDisabled } from '../hooks/useSwapOutputQuotesDisable
import { SyncGasStateToSharedValues, SyncQuoteSharedValuesToState } from './SyncSwapStateAndSharedValues';
import { performanceTracking, Screens, TimeToSignOperation } from '@/state/performance/performance';
import { getRemoteConfig } from '@/model/remoteConfig';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
const swapping = i18n.t(i18n.l.swap.actions.swapping);
const holdToSwap = i18n.t(i18n.l.swap.actions.hold_to_swap);
@@ -199,8 +200,7 @@ export const SwapProvider = ({ children }: SwapProviderProps) => {
parameters.flashbots && getNetworkObject({ chainId: parameters.chainId }).features.flashbots
? await getFlashbotsProvider()
: getProvider({ chainId: parameters.chainId });
- const providerUrl = provider?.connection?.url;
- const connectedToHardhat = !!providerUrl && isHardHat(providerUrl);
+ const connectedToHardhat = useConnectedToHardhatStore.getState().connectedToHardhat;
const isBridge = swapsStore.getState().inputAsset?.mainnetAddress === swapsStore.getState().outputAsset?.mainnetAddress;
const isDegenModeEnabled = swapsStore.getState().degenMode;
@@ -258,7 +258,7 @@ export const SwapProvider = ({ children }: SwapProviderProps) => {
};
}
- const chainId = getIsHardhatConnected() ? ChainId.hardhat : parameters.chainId;
+ const chainId = connectedToHardhat ? ChainId.hardhat : parameters.chainId;
const { errorMessage } = await performanceTracking.getState().executeFn({
fn: walletExecuteRap,
screen: Screens.SWAPS,
diff --git a/src/__swaps__/screens/Swap/resources/assets/userAssets.ts b/src/__swaps__/screens/Swap/resources/assets/userAssets.ts
index 4b14f675c49..37dc8c9f185 100644
--- a/src/__swaps__/screens/Swap/resources/assets/userAssets.ts
+++ b/src/__swaps__/screens/Swap/resources/assets/userAssets.ts
@@ -4,7 +4,6 @@ import { Address } from 'viem';
import { QueryConfigWithSelect, QueryFunctionArgs, QueryFunctionResult, createQueryKey, queryClient } from '@/react-query';
-import { getIsHardhatConnected } from '@/handlers/web3';
import { RainbowError, logger } from '@/logger';
import { RainbowFetchClient } from '@/rainbow-fetch';
import { SupportedCurrencyKey, SUPPORTED_CHAIN_IDS } from '@/references';
diff --git a/src/__swaps__/utils/decimalFormatter.ts b/src/__swaps__/utils/decimalFormatter.ts
index 5b047b8c677..fc0f9a943ec 100644
--- a/src/__swaps__/utils/decimalFormatter.ts
+++ b/src/__swaps__/utils/decimalFormatter.ts
@@ -82,7 +82,7 @@ export function valueBasedDecimalFormatter({
// Format the number to add separators and trim trailing zeros
const numberFormatter = new Intl.NumberFormat('en-US', {
minimumFractionDigits: minimumDecimalPlaces,
- maximumFractionDigits: maximumDecimalPlaces,
+ maximumFractionDigits: maximumDecimalPlaces || 0,
useGrouping: !stripSeparators,
});
diff --git a/src/handlers/web3.ts b/src/handlers/web3.ts
index 75c1dd85022..13416a8aceb 100644
--- a/src/handlers/web3.ts
+++ b/src/handlers/web3.ts
@@ -166,15 +166,6 @@ export const isL2Chain = ({ chainId }: { chainId: ChainId }): boolean => {
return getNetworkObject({ chainId }).networkType === 'layer2';
};
-/**
- * @desc Checks whether a provider is HardHat.
- * @param providerUrl The provider URL.
- * @return Whether or not the provider is HardHat.
- */
-export const isHardHat = (providerUrl: string): boolean => {
- return providerUrl?.startsWith('http://') && providerUrl?.endsWith('8545');
-};
-
/**
* @desc Checks if the given network is a testnet.
* @param network The network to check.
@@ -201,29 +192,18 @@ export const getCachedProviderForNetwork = (chainId: ChainId = ChainId.mainnet):
export const getProvider = ({ chainId }: { chainId: number }): StaticJsonRpcProvider => {
const cachedProvider = chainsProviders.get(chainId);
- if (cachedProvider) {
+ const networkObject = getNetworkObject({ chainId });
+
+ if (cachedProvider && cachedProvider?.connection.url === networkObject.rpc()) {
return cachedProvider;
}
- const networkObject = getNetworkObject({ chainId });
-
const provider = new StaticJsonRpcProvider(networkObject.rpc(), networkObject.id);
chainsProviders.set(chainId, provider);
return provider;
};
-/**
- * @desc Checks if the active network is Hardhat.
- * @returns boolean: `true` if connected to Hardhat.
- */
-export const getIsHardhatConnected = (): boolean => {
- const currentChainId = store.getState().settings.chainId;
- const currentProviderUrl = getCachedProviderForNetwork(currentChainId)?.connection?.url;
- const connectedToHardhat = !!currentProviderUrl && isHardHat(currentProviderUrl);
- return connectedToHardhat;
-};
-
/**
* @desc Sends an arbitrary RPC call using a given provider, or the default
* cached provider.
diff --git a/src/helpers/RainbowContext.tsx b/src/helpers/RainbowContext.tsx
index 44dca36510b..c0734b50313 100644
--- a/src/helpers/RainbowContext.tsx
+++ b/src/helpers/RainbowContext.tsx
@@ -27,7 +27,7 @@ export default function RainbowContextWrapper({ children }: PropsWithChildren) {
// This value is hold here to prevent JS VM from shutting down
// on unmounting all shared values.
useSharedValue(0);
- const setConnectedToHardhat = useConnectedToHardhatStore.getState().setConnectedToHardhat;
+ const { setConnectedToHardhat } = useConnectedToHardhatStore();
const [config, setConfig] = useState>(
Object.entries(defaultConfig).reduce((acc, [key, { value }]) => ({ ...acc, [key]: value }), {})
);
diff --git a/src/hooks/useENSRegistrationStepHandler.tsx b/src/hooks/useENSRegistrationStepHandler.tsx
index 5110a579106..f53c8ece33a 100644
--- a/src/hooks/useENSRegistrationStepHandler.tsx
+++ b/src/hooks/useENSRegistrationStepHandler.tsx
@@ -4,7 +4,7 @@ import { useDispatch } from 'react-redux';
import usePrevious from './usePrevious';
import { useENSRegistration, useInterval } from '.';
import { RegistrationParameters } from '@/entities';
-import { getProvider, isHardHat, web3Provider } from '@/handlers/web3';
+import { getProvider } from '@/handlers/web3';
import {
ENS_SECONDS_PADDING,
ENS_SECONDS_WAIT,
@@ -15,15 +15,16 @@ import {
} from '@/helpers/ens';
import { updateTransactionRegistrationParameters } from '@/redux/ensRegistration';
import { ChainId } from '@/networks/types';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
const checkRegisterBlockTimestamp = async ({
registrationParameters,
secondsSinceCommitConfirmed,
- isTestingHardhat,
+ connectedToHardhat,
}: {
registrationParameters: RegistrationParameters;
secondsSinceCommitConfirmed: number;
- isTestingHardhat: boolean;
+ connectedToHardhat: boolean;
}) => {
try {
const provider = getProvider({ chainId: ChainId.mainnet });
@@ -34,7 +35,7 @@ const checkRegisterBlockTimestamp = async ({
(secs > ENS_SECONDS_WAIT_WITH_PADDING && secondsSinceCommitConfirmed > ENS_SECONDS_WAIT_WITH_PADDING) ||
// sometimes the provider.getBlock('latest) takes a long time to update to newest block
secondsSinceCommitConfirmed > ENS_SECONDS_WAIT_PROVIDER_PADDING ||
- isTestingHardhat
+ connectedToHardhat
) {
return true;
}
@@ -61,12 +62,12 @@ export default function useENSRegistrationStepHandler(observer = true) {
-1
);
- const isTestingHardhat = useMemo(() => isHardHat(web3Provider.connection.url), []);
+ const { connectedToHardhat } = useConnectedToHardhatStore();
const [readyToRegister, setReadyToRegister] = useState(secondsSinceCommitConfirmed > ENS_SECONDS_WAIT);
// flag to wait 10 secs before we get the tx block, to be able to simulate not confirmed tx when testing
- const shouldLoopForConfirmation = useRef(isTestingHardhat);
+ const shouldLoopForConfirmation = useRef(connectedToHardhat);
const registrationStep = useMemo(() => {
if (mode === REGISTRATION_MODES.EDIT) return REGISTRATION_STEPS.EDIT;
@@ -100,7 +101,7 @@ export default function useENSRegistrationStepHandler(observer = true) {
const now = Date.now();
const msBlockTimestamp = getBlockMsTimestamp(block);
// hardhat block timestamp is behind
- const timeDifference = isTestingHardhat ? now - msBlockTimestamp : 0;
+ const timeDifference = connectedToHardhat ? now - msBlockTimestamp : 0;
const commitTransactionConfirmedAt = msBlockTimestamp + timeDifference;
const secs = differenceInSeconds(now, commitTransactionConfirmedAt);
setSecondsSinceCommitConfirmed(secondsSinceCommitConfirmed < 0 ? 0 : secs);
@@ -114,7 +115,7 @@ export default function useENSRegistrationStepHandler(observer = true) {
shouldLoopForConfirmation.current = false;
}
return confirmed;
- }, [observer, commitTransactionHash, isTestingHardhat, secondsSinceCommitConfirmed, dispatch]);
+ }, [observer, commitTransactionHash, connectedToHardhat, secondsSinceCommitConfirmed, dispatch]);
const startPollingWatchCommitTransaction = useCallback(async () => {
if (observer) return;
@@ -167,7 +168,7 @@ export default function useENSRegistrationStepHandler(observer = true) {
if (!observer && secondsSinceCommitConfirmed % 2 === 0 && secondsSinceCommitConfirmed >= ENS_SECONDS_WAIT && !readyToRegister) {
const checkIfReadyToRegister = async () => {
const readyToRegister = await checkRegisterBlockTimestamp({
- isTestingHardhat,
+ connectedToHardhat,
registrationParameters,
secondsSinceCommitConfirmed,
});
@@ -175,7 +176,7 @@ export default function useENSRegistrationStepHandler(observer = true) {
};
checkIfReadyToRegister();
}
- }, [isTestingHardhat, observer, readyToRegister, registrationParameters, secondsSinceCommitConfirmed]);
+ }, [connectedToHardhat, observer, readyToRegister, registrationParameters, secondsSinceCommitConfirmed]);
useEffect(
() => () => {
diff --git a/src/hooks/useImportingWallet.ts b/src/hooks/useImportingWallet.ts
index d2fce5085a5..1523bae55c4 100644
--- a/src/hooks/useImportingWallet.ts
+++ b/src/hooks/useImportingWallet.ts
@@ -123,9 +123,9 @@ export default function useImportingWallet({ showImportModal = true } = {}) {
// Validate ENS
if (isENSAddressFormat(input)) {
try {
- const web3Provider = getProvider({ chainId: ChainId.mainnet });
+ const provider = getProvider({ chainId: ChainId.mainnet });
const [address, avatar] = await Promise.all([
- web3Provider.resolveName(input),
+ provider.resolveName(input),
!avatarUrl && profilesEnabled && fetchENSAvatar(input, { swallowError: true }),
]);
if (!address) {
diff --git a/src/hooks/useRefreshAccountData.ts b/src/hooks/useRefreshAccountData.ts
index 056b3c1af94..f9cb7ab786c 100644
--- a/src/hooks/useRefreshAccountData.ts
+++ b/src/hooks/useRefreshAccountData.ts
@@ -1,7 +1,6 @@
import delay from 'delay';
import { useCallback, useMemo, useState } from 'react';
import { useDispatch } from 'react-redux';
-import { getIsHardhatConnected } from '@/handlers/web3';
import { walletConnectLoadState } from '../redux/walletconnect';
import { fetchWalletENSAvatars, fetchWalletNames } from '../redux/wallets';
import useAccountSettings from './useAccountSettings';
@@ -16,6 +15,7 @@ import useNftSort from './useNFTsSortBy';
import { Address } from 'viem';
import { addysSummaryQueryKey } from '@/resources/summary/summary';
import useWallets from './useWallets';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
export default function useRefreshAccountData() {
const dispatch = useDispatch();
@@ -23,6 +23,7 @@ export default function useRefreshAccountData() {
const [isRefreshing, setIsRefreshing] = useState(false);
const profilesEnabled = useExperimentalFlag(PROFILES);
const { nftSort } = useNftSort();
+ const { connectedToHardhat } = useConnectedToHardhatStore();
const { wallets } = useWallets();
@@ -32,8 +33,6 @@ export default function useRefreshAccountData() {
);
const fetchAccountData = useCallback(async () => {
- const connectedToHardhat = getIsHardhatConnected();
-
queryClient.invalidateQueries(nftsQueryKey({ address: accountAddress, sortBy: nftSort }));
queryClient.invalidateQueries(positionsQueryKey({ address: accountAddress as Address, currency: nativeCurrency }));
queryClient.invalidateQueries(addysSummaryQueryKey({ addresses: allAddresses, currency: nativeCurrency }));
@@ -56,7 +55,7 @@ export default function useRefreshAccountData() {
logger.error(new RainbowError(`[useRefreshAccountData]: Error refreshing data: ${error}`));
throw error;
}
- }, [accountAddress, dispatch, nativeCurrency, profilesEnabled]);
+ }, [accountAddress, allAddresses, connectedToHardhat, dispatch, nativeCurrency, nftSort, profilesEnabled]);
const refresh = useCallback(async () => {
if (isRefreshing) return;
diff --git a/src/hooks/useWatchPendingTxs.ts b/src/hooks/useWatchPendingTxs.ts
index 72ec35f0a93..20ddd2169fe 100644
--- a/src/hooks/useWatchPendingTxs.ts
+++ b/src/hooks/useWatchPendingTxs.ts
@@ -5,7 +5,7 @@ import { userAssetsQueryKey } from '@/resources/assets/UserAssetsQuery';
import { userAssetsQueryKey as swapsUserAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets';
import { transactionFetchQuery } from '@/resources/transactions/transaction';
import { RainbowError, logger } from '@/logger';
-import { getIsHardhatConnected, getProvider } from '@/handlers/web3';
+import { getProvider } from '@/handlers/web3';
import { consolidatedTransactionsQueryKey } from '@/resources/transactions/consolidatedTransactions';
import { RainbowNetworkObjects } from '@/networks';
import { queryClient } from '@/react-query/queryClient';
@@ -17,12 +17,14 @@ import { nftsQueryKey } from '@/resources/nfts';
import { getNftSortForAddress } from './useNFTsSortBy';
import { ChainId } from '@/networks/types';
import { staleBalancesStore } from '@/state/staleBalances';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
export const useWatchPendingTransactions = ({ address }: { address: string }) => {
const { storePendingTransactions, setPendingTransactions } = usePendingTransactionsStore(state => ({
storePendingTransactions: state.pendingTransactions,
setPendingTransactions: state.setPendingTransactions,
}));
+ const { connectedToHardhat } = useConnectedToHardhatStore();
const setNonce = useNonceStore(state => state.setNonce);
@@ -33,7 +35,6 @@ export const useWatchPendingTransactions = ({ address }: { address: string }) =>
const refreshAssets = useCallback(
(_: RainbowTransaction) => {
// NOTE: We have two user assets stores right now, so let's invalidate both queries and trigger a refetch
- const connectedToHardhat = getIsHardhatConnected();
queryClient.invalidateQueries(
userAssetsQueryKey({
address,
@@ -50,7 +51,7 @@ export const useWatchPendingTransactions = ({ address }: { address: string }) =>
);
queryClient.invalidateQueries(nftsQueryKey({ address, sortBy: getNftSortForAddress(address) }));
},
- [address, nativeCurrency]
+ [address, connectedToHardhat, nativeCurrency]
);
const processFlashbotsTransaction = useCallback(async (tx: RainbowTransaction): Promise => {
@@ -165,7 +166,6 @@ export const useWatchPendingTransactions = ({ address }: { address: string }) =>
);
const watchPendingTransactions = useCallback(async () => {
- const connectedToHardhat = getIsHardhatConnected();
if (!pendingTransactions?.length) return;
const updatedPendingTransactions = await Promise.all(
pendingTransactions.map((tx: RainbowTransaction) => processPendingTransaction(tx))
@@ -229,7 +229,7 @@ export const useWatchPendingTransactions = ({ address }: { address: string }) =>
address,
pendingTransactions: newPendingTransactions,
});
- }, [address, nativeCurrency, pendingTransactions, processNonces, processPendingTransaction, setPendingTransactions]);
+ }, [address, connectedToHardhat, nativeCurrency, pendingTransactions, processNonces, processPendingTransaction, setPendingTransactions]);
return { watchPendingTransactions };
};
diff --git a/src/redux/explorer.ts b/src/redux/explorer.ts
index 39465af9ae5..0892e4b5e8c 100644
--- a/src/redux/explorer.ts
+++ b/src/redux/explorer.ts
@@ -4,8 +4,8 @@ import { ThunkDispatch } from 'redux-thunk';
import { io, Socket } from 'socket.io-client';
import { getRemoteConfig } from '@/model/remoteConfig';
import { AppGetState, AppState } from './store';
-import { getProvider, isHardHat } from '@/handlers/web3';
import { ChainId } from '@/networks/types';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
// -- Constants --------------------------------------- //
const EXPLORER_UPDATE_SOCKETS = 'explorer/EXPLORER_UPDATE_SOCKETS';
@@ -118,9 +118,7 @@ export const explorerInit = () => (dispatch: ThunkDispatch => {
const networkObject = getNetworkObject({ chainId });
- const balanceCheckerContract = new Contract(networkObject.balanceCheckerAddress, balanceCheckerContractAbi, web3Provider);
+ const provider = getProvider({ chainId });
+ const balanceCheckerContract = new Contract(networkObject.balanceCheckerAddress, balanceCheckerContractAbi, provider);
try {
const values = await balanceCheckerContract.balances([address], tokens);
const balances: {
diff --git a/src/resources/assets/useSortedUserAssets.ts b/src/resources/assets/useSortedUserAssets.ts
index 96cd2e91490..b7e80d92c71 100644
--- a/src/resources/assets/useSortedUserAssets.ts
+++ b/src/resources/assets/useSortedUserAssets.ts
@@ -1,11 +1,11 @@
-import { getIsHardhatConnected } from '@/handlers/web3';
import { useAccountSettings } from '@/hooks';
import { selectSortedUserAssets } from '@/resources/assets/assetSelectors';
import { useUserAssets } from '@/resources/assets/UserAssetsQuery';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
export function useSortedUserAssets() {
const { accountAddress, nativeCurrency } = useAccountSettings();
- const connectedToHardhat = getIsHardhatConnected();
+ const { connectedToHardhat } = useConnectedToHardhatStore();
return useUserAssets(
{
diff --git a/src/resources/assets/useUserAsset.ts b/src/resources/assets/useUserAsset.ts
index 50f9b072410..bad1a672d05 100644
--- a/src/resources/assets/useUserAsset.ts
+++ b/src/resources/assets/useUserAsset.ts
@@ -1,14 +1,14 @@
import { ChainId } from '@/networks/types';
-import { getIsHardhatConnected } from '@/handlers/web3';
import { useAccountSettings } from '@/hooks';
import { getNetworkObject } from '@/networks';
import { useUserAssets } from '@/resources/assets/UserAssetsQuery';
import { selectUserAssetWithUniqueId } from '@/resources/assets/assetSelectors';
import { getUniqueId } from '@/utils/ethereumUtils';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
export function useUserAsset(uniqueId: string) {
const { accountAddress, nativeCurrency } = useAccountSettings();
- const connectedToHardhat = getIsHardhatConnected();
+ const { connectedToHardhat } = useConnectedToHardhatStore();
return useUserAssets(
{
diff --git a/src/resources/assets/useUserAssetCount.ts b/src/resources/assets/useUserAssetCount.ts
index bd414a8c651..7cf00ced409 100644
--- a/src/resources/assets/useUserAssetCount.ts
+++ b/src/resources/assets/useUserAssetCount.ts
@@ -1,13 +1,13 @@
-import { getIsHardhatConnected } from '@/handlers/web3';
import { useAccountSettings } from '@/hooks';
import { useUserAssets } from '@/resources/assets/UserAssetsQuery';
import { RainbowAddressAssets } from './types';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
const countSelector = (accountAssets: RainbowAddressAssets) => accountAssets?.length;
export function useUserAssetCount() {
const { accountAddress, nativeCurrency } = useAccountSettings();
- const connectedToHardhat = getIsHardhatConnected();
+ const { connectedToHardhat } = useConnectedToHardhatStore();
return useUserAssets(
{
diff --git a/src/screens/SendSheet.js b/src/screens/SendSheet.js
index 1d7438f1519..3cff2615a5b 100644
--- a/src/screens/SendSheet.js
+++ b/src/screens/SendSheet.js
@@ -1,5 +1,4 @@
import { useRoute } from '@react-navigation/native';
-import { captureEvent, captureException } from '@sentry/react-native';
import lang from 'i18n-js';
import { isEmpty, isEqual, isString } from 'lodash';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
@@ -23,7 +22,6 @@ import {
getProvider,
isL2Chain,
resolveNameOrAddress,
- web3Provider,
} from '@/handlers/web3';
import { checkIsValidAddressOrDomain, checkIsValidAddressOrDomainFormat, isENSAddressFormat } from '@/helpers/validators';
import {
@@ -283,14 +281,13 @@ export default function SendSheet(props) {
useEffect(() => {
const assetChainId = selected.chainId;
if (assetChainId && (assetChainId !== currentChainId || !currentChainId || prevChainId !== currentChainId)) {
- let provider = web3Provider;
if (chainId === ChainId.goerli) {
setCurrentChainId(ChainId.goerli);
- provider = getProvider({ chainId: ChainId.goerli });
+ const provider = getProvider({ chainId: ChainId.goerli });
setCurrentProvider(provider);
} else {
setCurrentChainId(assetChainId);
- provider = getProvider({ chainId: currentChainId });
+ const provider = getProvider({ chainId: currentChainId });
setCurrentProvider(provider);
}
}
diff --git a/src/state/assets/userAssets.ts b/src/state/assets/userAssets.ts
index 512dfd56eed..2a97a31f284 100644
--- a/src/state/assets/userAssets.ts
+++ b/src/state/assets/userAssets.ts
@@ -1,5 +1,4 @@
import { ParsedSearchAsset, UniqueId, UserAssetFilter } from '@/__swaps__/types/assets';
-import { getIsHardhatConnected } from '@/handlers/web3';
import { Address } from 'viem';
import { RainbowError, logger } from '@/logger';
import store from '@/redux/store';
@@ -7,6 +6,7 @@ import { ETH_ADDRESS, SUPPORTED_CHAIN_IDS, supportedNativeCurrencies } from '@/r
import { createRainbowStore } from '@/state/internal/createRainbowStore';
import { swapsStore } from '@/state/swaps/swapsStore';
import { ChainId } from '@/networks/types';
+import { useConnectedToHardhatStore } from '../connectedToHardhat';
const SEARCH_CACHE_MAX_ENTRIES = 50;
@@ -278,7 +278,7 @@ export const userAssetsStore = createRainbowStore(
});
// Ensure all supported chains are in the map with a fallback value of 0
- SUPPORTED_CHAIN_IDS({ testnetMode: getIsHardhatConnected() }).forEach(chainId => {
+ SUPPORTED_CHAIN_IDS({ testnetMode: useConnectedToHardhatStore.getState().connectedToHardhat }).forEach(chainId => {
if (!unsortedChainBalances.has(chainId)) {
unsortedChainBalances.set(chainId, 0);
idsByChain.set(chainId, []);
diff --git a/src/state/sync/UserAssetsSync.tsx b/src/state/sync/UserAssetsSync.tsx
index e97b968911d..4c8c379c775 100644
--- a/src/state/sync/UserAssetsSync.tsx
+++ b/src/state/sync/UserAssetsSync.tsx
@@ -4,21 +4,22 @@ import { userAssetsStore } from '@/state/assets/userAssets';
import { useSwapsStore } from '@/state/swaps/swapsStore';
import { selectUserAssetsList, selectorFilterByUserChains } from '@/__swaps__/screens/Swap/resources/_selectors/assets';
import { ParsedSearchAsset } from '@/__swaps__/types/assets';
-import { getIsHardhatConnected } from '@/handlers/web3';
import { useUserAssets } from '@/__swaps__/screens/Swap/resources/assets';
import { ChainId } from '@/networks/types';
+import { useConnectedToHardhatStore } from '../connectedToHardhat';
export const UserAssetsSync = function UserAssetsSync() {
const { accountAddress: currentAddress, nativeCurrency: currentCurrency } = useAccountSettings();
const userAssetsWalletAddress = userAssetsStore(state => state.associatedWalletAddress);
const isSwapsOpen = useSwapsStore(state => state.isSwapsOpen);
+ const { connectedToHardhat } = useConnectedToHardhatStore();
useUserAssets(
{
address: currentAddress as Address,
currency: currentCurrency,
- testnetMode: getIsHardhatConnected(),
+ testnetMode: connectedToHardhat,
},
{
enabled: !isSwapsOpen || userAssetsWalletAddress !== currentAddress,
diff --git a/src/utils/ethereumUtils.ts b/src/utils/ethereumUtils.ts
index 9d96405b93f..00ac9f63577 100644
--- a/src/utils/ethereumUtils.ts
+++ b/src/utils/ethereumUtils.ts
@@ -24,7 +24,7 @@ import {
SelectedGasFee,
} from '@/entities';
import { getOnchainAssetBalance } from '@/handlers/assets';
-import { getIsHardhatConnected, getProvider, isTestnetChain, toHex } from '@/handlers/web3';
+import { getProvider, isTestnetChain, toHex } from '@/handlers/web3';
import { convertRawAmountToDecimalFormat, fromWei, greaterThan, isZero, subtract, add } from '@/helpers/utilities';
import { Navigation } from '@/navigation';
import { parseAssetNative } from '@/parsers';
@@ -51,6 +51,7 @@ import {
} from '@/resources/assets/externalAssetsQuery';
import { ChainId, Network } from '@/networks/types';
import { AddressOrEth } from '@/__swaps__/types/assets';
+import { useConnectedToHardhatStore } from '@/state/connectedToHardhat';
const getNetworkNativeAsset = ({ chainId }: { chainId: ChainId }) => {
const nativeAssetAddress = getNetworkObject({ chainId }).nativeCurrency.address;
@@ -121,7 +122,7 @@ const getAsset = (accountAssets: Record, uniqueId: E
const getUserAssetFromCache = (uniqueId: string) => {
const { accountAddress, nativeCurrency } = store.getState().settings;
- const connectedToHardhat = getIsHardhatConnected();
+ const connectedToHardhat = useConnectedToHardhatStore.getState().connectedToHardhat;
const cache = queryClient.getQueryCache();
diff --git a/src/utils/methodRegistry.ts b/src/utils/methodRegistry.ts
index 082b1b7c39c..21abc903164 100644
--- a/src/utils/methodRegistry.ts
+++ b/src/utils/methodRegistry.ts
@@ -1,5 +1,5 @@
import { Contract } from '@ethersproject/contracts';
-import { web3Provider } from '../handlers/web3';
+import { getProvider } from '../handlers/web3';
import namesOverrides from '../references/method-names-overrides.json';
import methodRegistryABI from '../references/method-registry-abi.json';
import { metadataClient } from '@/graphql';
@@ -17,7 +17,8 @@ export const methodRegistryLookupAndParse = async (methodSignatureBytes: any, ch
if (data?.contractFunction?.text) {
signature = data.contractFunction.text;
} else {
- const registry = new Contract(METHOD_REGISTRY_ADDRESS, methodRegistryABI, web3Provider);
+ const provider = getProvider({ chainId });
+ const registry = new Contract(METHOD_REGISTRY_ADDRESS, methodRegistryABI, provider);
signature = await registry.entries(methodSignatureBytes);
}