-
-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FIX: switching networks bug #4770
Changes from 5 commits
2f07fb1
d9e7460
f9e2750
d031056
3f39ea7
b590e06
8c75399
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -14,7 +14,7 @@ import { | |||||||||||||||||||||||||||||||||||||||||
Transaction, | ||||||||||||||||||||||||||||||||||||||||||
SystemProgram, | ||||||||||||||||||||||||||||||||||||||||||
} from '@solana/web3.js'; | ||||||||||||||||||||||||||||||||||||||||||
import { useBalance, useDisconnect, useAccount } from 'wagmi'; | ||||||||||||||||||||||||||||||||||||||||||
import { useBalance, useDisconnect, useAccount, useSwitchChain } from 'wagmi'; | ||||||||||||||||||||||||||||||||||||||||||
import { getWalletClient } from '@wagmi/core'; | ||||||||||||||||||||||||||||||||||||||||||
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'; | ||||||||||||||||||||||||||||||||||||||||||
import { useWeb3Modal } from '@web3modal/wagmi/react'; | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -58,6 +58,7 @@ interface IGeneralWalletContext { | |||||||||||||||||||||||||||||||||||||||||
handleSignOutAndShowWelcomeModal: () => Promise<void>; | ||||||||||||||||||||||||||||||||||||||||||
isOnSolana: boolean; | ||||||||||||||||||||||||||||||||||||||||||
isOnEVM: boolean; | ||||||||||||||||||||||||||||||||||||||||||
setPendingNetworkId: (id: number | null) => void; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
// Create the context | ||||||||||||||||||||||||||||||||||||||||||
export const GeneralWalletContext = createContext<IGeneralWalletContext>({ | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -76,6 +77,7 @@ export const GeneralWalletContext = createContext<IGeneralWalletContext>({ | |||||||||||||||||||||||||||||||||||||||||
handleSignOutAndShowWelcomeModal: async () => {}, | ||||||||||||||||||||||||||||||||||||||||||
isOnSolana: false, | ||||||||||||||||||||||||||||||||||||||||||
isOnEVM: false, | ||||||||||||||||||||||||||||||||||||||||||
setPendingNetworkId: () => {}, | ||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const getPhantomSolanaProvider = () => { | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -93,6 +95,9 @@ export const GeneralWalletProvider: React.FC<{ | |||||||||||||||||||||||||||||||||||||||||
const [walletChainType, setWalletChainType] = useState<ChainType | null>( | ||||||||||||||||||||||||||||||||||||||||||
null, | ||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||
const [pendingNetworkId, setPendingNetworkId] = useState<number | null>( | ||||||||||||||||||||||||||||||||||||||||||
null, | ||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||
const [walletAddress, setWalletAddress] = useState<string | null>(null); | ||||||||||||||||||||||||||||||||||||||||||
const [balance, setBalance] = useState<string>(); | ||||||||||||||||||||||||||||||||||||||||||
const [isConnected, setIsConnected] = useState<boolean>(false); | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -106,6 +111,7 @@ export const GeneralWalletProvider: React.FC<{ | |||||||||||||||||||||||||||||||||||||||||
const router = useRouter(); | ||||||||||||||||||||||||||||||||||||||||||
const { token } = useAppSelector(state => state.user); | ||||||||||||||||||||||||||||||||||||||||||
const { setVisible, visible } = useWalletModal(); | ||||||||||||||||||||||||||||||||||||||||||
const { switchChain } = useSwitchChain(); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const isGIVeconomyRoute = useMemo( | ||||||||||||||||||||||||||||||||||||||||||
() => checkIsGIVeconomyRoute(router.route), | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -266,6 +272,13 @@ export const GeneralWalletProvider: React.FC<{ | |||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
}, [walletChainType, nonFormattedEvBalance, solanaBalance]); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||
if (walletChainType === ChainType.EVM && pendingNetworkId !== null) { | ||||||||||||||||||||||||||||||||||||||||||
switchChain?.({ chainId: pendingNetworkId }); | ||||||||||||||||||||||||||||||||||||||||||
setPendingNetworkId(null); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
}, [walletChainType, pendingNetworkId]); | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+275
to
+280
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle Asynchronous The Consider modifying the code to handle the asynchronous call and catch any errors: useEffect(() => {
- if (walletChainType === ChainType.EVM && pendingNetworkId !== null) {
- switchChain?.({ chainId: pendingNetworkId });
- setPendingNetworkId(null);
- }
+ const performSwitchChain = async () => {
+ if (walletChainType === ChainType.EVM && pendingNetworkId !== null) {
+ try {
+ await switchChain?.({ chainId: pendingNetworkId });
+ } catch (error) {
+ console.error('Error switching chain:', error);
+ } finally {
+ setPendingNetworkId(null);
+ }
+ }
+ };
+ performSwitchChain();
}, [walletChainType, pendingNetworkId]); Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const signMessage = async ( | ||||||||||||||||||||||||||||||||||||||||||
message: string, | ||||||||||||||||||||||||||||||||||||||||||
): Promise<string | undefined> => { | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -408,6 +421,7 @@ export const GeneralWalletProvider: React.FC<{ | |||||||||||||||||||||||||||||||||||||||||
handleSignOutAndShowWelcomeModal, | ||||||||||||||||||||||||||||||||||||||||||
isOnSolana, | ||||||||||||||||||||||||||||||||||||||||||
isOnEVM, | ||||||||||||||||||||||||||||||||||||||||||
setPendingNetworkId, | ||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// Render the provider component with the provided context value | ||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Inconsistent Function Signature for
setPendingNetworkId
The default implementation of
setPendingNetworkId
inGeneralWalletContext
does not match the interface signature. The interface expects(id: number | null) => void
, but the default value issetPendingNetworkId: () => {}
, which accepts no parameters. This inconsistency could lead to type errors or unexpected behavior.Apply the following diff to fix the inconsistency: