From 3b941e610ceb3444d156015a8276e99c2d199e57 Mon Sep 17 00:00:00 2001 From: Martin Grabina Date: Mon, 11 May 2026 19:17:04 -0300 Subject: [PATCH] fix(analytics): drive walletType from wagmi useAccount ConnectKit's onConnect callback skips reconnects (wagmi emits the connect event with isReconnected=true on every auto-reconnect), so walletType was only set on fresh connects and lost on every page reload. ~86% of Transaction events in Amplitude have walletType=undefined as a result. Drive walletType from useAccount() in Web3Provider instead, so it stays accurate across reconnects, page reloads, and the Aave Accounts redirect-back flow. --- pages/_app.page.tsx | 10 ++-------- src/libs/web3-data-provider/Web3Provider.tsx | 21 +++++++++++++++++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/pages/_app.page.tsx b/pages/_app.page.tsx index 169f4ef1bd..63c44c7ec6 100644 --- a/pages/_app.page.tsx +++ b/pages/_app.page.tsx @@ -26,7 +26,6 @@ import { useRootStore } from 'src/store/root'; import { SharedDependenciesProvider } from 'src/ui-config/SharedDependenciesProvider'; import { wagmiConfig } from 'src/ui-config/wagmiConfig'; import { WagmiProvider } from 'wagmi'; -import { useShallow } from 'zustand/shallow'; import createEmotionCache from '../src/createEmotionCache'; import { AppGlobalStyles } from '../src/layouts/AppGlobalStyles'; @@ -112,9 +111,7 @@ interface MyAppProps extends AppProps { export default function MyApp(props: MyAppProps) { const { Component, emotionCache = clientSideEmotionCache, pageProps } = props; const getLayout = Component.getLayout ?? ((page: ReactNode) => page); - const [initializeEventsTracking, setWalletType] = useRootStore( - useShallow((store) => [store.initializeEventsTracking, store.setWalletType]) - ); + const initializeEventsTracking = useRootStore((store) => store.initializeEventsTracking); const [queryClient] = useState( () => new QueryClient({ @@ -155,10 +152,7 @@ export default function MyApp(props: MyAppProps) { - setWalletType(connectorId)} - > + diff --git a/src/libs/web3-data-provider/Web3Provider.tsx b/src/libs/web3-data-provider/Web3Provider.tsx index 92d8bb179b..a0f0da5484 100644 --- a/src/libs/web3-data-provider/Web3Provider.tsx +++ b/src/libs/web3-data-provider/Web3Provider.tsx @@ -44,13 +44,17 @@ let didAutoConnectForCypress = false; export const Web3ContextProvider: React.FC<{ children: ReactElement }> = ({ children }) => { const { switchChainAsync } = useSwitchChain(); const { watchAssetAsync } = useWatchAsset(); - const { chainId, address } = useAccount(); + const { chainId, address, status, connector } = useAccount(); const { connect, connectors } = useConnect(); const [readOnlyModeAddress, setReadOnlyModeAddress] = useState(); const [switchNetworkError, setSwitchNetworkError] = useState(); - const [setAccount, setConnectedAccountIsContract] = useRootStore( - useShallow((store) => [store.setAccount, store.setConnectedAccountIsContract]) + const [setAccount, setConnectedAccountIsContract, setWalletType] = useRootStore( + useShallow((store) => [ + store.setAccount, + store.setConnectedAccountIsContract, + store.setWalletType, + ]) ); const account = address; @@ -203,6 +207,17 @@ export const Web3ContextProvider: React.FC<{ children: ReactElement }> = ({ chil setAccount(account?.toLowerCase()); }, [account, setAccount]); + // Drive walletType from wagmi's account state so it survives page reloads. + // ConnectKit's `onConnect` prop only fires on fresh connect (not on reconnect), + // which caused most transaction events to be tracked with walletType=undefined. + useEffect(() => { + if (status === 'connected' && connector?.id) { + setWalletType(connector.id); + } else if (status === 'disconnected') { + setWalletType(undefined); + } + }, [status, connector?.id, setWalletType]); + useEffect(() => { if (readOnlyModeAddress) { setAccount(readOnlyModeAddress.toLowerCase());