From 989f4af0b2b1fd782cd8bb0d67ecd54efa1dd4ef Mon Sep 17 00:00:00 2001 From: kirill Date: Tue, 22 Jul 2025 17:10:22 +0300 Subject: [PATCH 1/4] fix: change browser provider, so it does not invoke metamask --- packages/apps/staking/src/hooks/useKVStore.ts | 13 ++++++++----- packages/apps/staking/src/hooks/useStake.ts | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/apps/staking/src/hooks/useKVStore.ts b/packages/apps/staking/src/hooks/useKVStore.ts index d2c4a0d993..24cf987032 100644 --- a/packages/apps/staking/src/hooks/useKVStore.ts +++ b/packages/apps/staking/src/hooks/useKVStore.ts @@ -1,5 +1,5 @@ import { ChainId, IKVStore, KVStoreClient } from '@human-protocol/sdk'; -import { ethers } from 'ethers'; +import { Eip1193Provider, ethers } from 'ethers'; import { useEffect, useState } from 'react'; import { useAccount, useWalletClient } from 'wagmi'; import { SUPPORTED_CHAIN_IDS } from '../constants/chains'; @@ -8,7 +8,7 @@ import { parseErrorMessage } from '../utils/string'; import { getKVStoreData } from '../services/dashboard'; export const useKVStore = () => { - const { address, chainId } = useAccount(); + const { address, chainId, connector } = useAccount(); const { data: walletClient } = useWalletClient(); const { showError, openSnackbar } = useSnackbar(); @@ -36,9 +36,12 @@ export const useKVStore = () => { useEffect(() => { const initStakingClient = async () => { try { - if (walletClient && address) { + if (walletClient && address && connector) { checkSupportedChain(); - const provider = new ethers.BrowserProvider(window.ethereum); + const eeip193Provider = await connector?.getProvider(); + const provider = new ethers.BrowserProvider( + eeip193Provider as Eip1193Provider + ); const signer = await provider.getSigner(); const client = await KVStoreClient.build(signer); @@ -53,7 +56,7 @@ export const useKVStore = () => { initStakingClient(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [walletClient, address, chainId]); + }, [walletClient, address, chainId, connector]); const checkSupportedChain = () => { const isSupportedChain = SUPPORTED_CHAIN_IDS.includes(chainId as ChainId); diff --git a/packages/apps/staking/src/hooks/useStake.ts b/packages/apps/staking/src/hooks/useStake.ts index a2a8b74905..f96ebd6a51 100644 --- a/packages/apps/staking/src/hooks/useStake.ts +++ b/packages/apps/staking/src/hooks/useStake.ts @@ -5,7 +5,7 @@ import { StakerInfo, StakingClient, } from '@human-protocol/sdk'; -import { ethers } from 'ethers'; +import { Eip1193Provider, ethers } from 'ethers'; import { useEffect, useState } from 'react'; import { useAccount, useWalletClient } from 'wagmi'; import { useSnackbar } from '../providers/SnackProvider'; @@ -14,7 +14,7 @@ import { formatAmount } from '../utils/units'; import { SUPPORTED_CHAIN_IDS } from '../constants/chains'; export const useStake = () => { - const { address, chainId } = useAccount(); + const { address, chainId, connector } = useAccount(); const { data: walletClient } = useWalletClient(); const { showError, openSnackbar } = useSnackbar(); @@ -27,9 +27,12 @@ export const useStake = () => { useEffect(() => { const initStakingClient = async () => { try { - if (walletClient && address) { + if (walletClient && address && connector) { checkSupportedChain(); - const provider = new ethers.BrowserProvider(window.ethereum); + const eeip193Provider = await connector?.getProvider(); + const provider = new ethers.BrowserProvider( + eeip193Provider as Eip1193Provider + ); const signer = await provider.getSigner(); const client = await StakingClient.build(signer); @@ -45,7 +48,7 @@ export const useStake = () => { initStakingClient(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [walletClient, address, chainId]); + }, [walletClient, address, chainId, connector]); const checkSupportedChain = () => { const isSupportedChain = SUPPORTED_CHAIN_IDS.includes(chainId as ChainId); From fb4863daa5428b70c70858f3990b5ec7dff627c8 Mon Sep 17 00:00:00 2001 From: kirill Date: Wed, 23 Jul 2025 23:40:42 +0300 Subject: [PATCH 2/4] change provider in stake and withdraw functions --- packages/apps/staking/src/hooks/useStake.ts | 27 +++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/apps/staking/src/hooks/useStake.ts b/packages/apps/staking/src/hooks/useStake.ts index f96ebd6a51..c413b7c9b7 100644 --- a/packages/apps/staking/src/hooks/useStake.ts +++ b/packages/apps/staking/src/hooks/useStake.ts @@ -23,6 +23,8 @@ export const useStake = () => { ); const [stakingData, setStakingData] = useState(null); const [tokenBalance, setTokenBalance] = useState(0); + const [browserProvider, setBrowserProvider] = + useState(null); useEffect(() => { const initStakingClient = async () => { @@ -33,6 +35,7 @@ export const useStake = () => { const provider = new ethers.BrowserProvider( eeip193Provider as Eip1193Provider ); + setBrowserProvider(provider); const signer = await provider.getSigner(); const client = await StakingClient.build(signer); @@ -102,6 +105,8 @@ export const useStake = () => { }; const handleStake = async (amount: string) => { + if (!browserProvider) return; + try { checkSupportedChain(); if (stakingClient && amount) { @@ -109,11 +114,7 @@ export const useStake = () => { await stakingClient.approveStake(weiAmount); await stakingClient.stake(weiAmount); await fetchStakingData(stakingClient); - await fetchTokenBalance( - new ethers.BrowserProvider(window.ethereum), - address!, - chainId - ); + await fetchTokenBalance(browserProvider, address!, chainId); openSnackbar('Stake successful', 'success'); } } catch (error) { @@ -123,17 +124,15 @@ export const useStake = () => { }; const handleUnstake = async (amount: string) => { + if (!browserProvider) return; + try { checkSupportedChain(); if (stakingClient && amount) { const weiAmount = ethers.parseUnits(amount, 'ether'); await stakingClient.unstake(weiAmount); await fetchStakingData(stakingClient); - await fetchTokenBalance( - new ethers.BrowserProvider(window.ethereum), - address!, - chainId - ); + await fetchTokenBalance(browserProvider, address!, chainId); openSnackbar('Unstake successful', 'success'); } } catch (error) { @@ -143,16 +142,14 @@ export const useStake = () => { }; const handleWithdraw = async () => { + if (!browserProvider) return; + try { checkSupportedChain(); if (stakingClient) { await stakingClient.withdraw(); await fetchStakingData(stakingClient); - await fetchTokenBalance( - new ethers.BrowserProvider(window.ethereum), - address!, - chainId - ); + await fetchTokenBalance(browserProvider, address!, chainId); openSnackbar('Withdraw successful', 'success'); } } catch (error) { From 5d62d20b2c0fe72c01e25459fffda8df846be001 Mon Sep 17 00:00:00 2001 From: kirill Date: Wed, 23 Jul 2025 23:44:32 +0300 Subject: [PATCH 3/4] chore: remove non-null assertion operator --- packages/apps/staking/src/hooks/useStake.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/apps/staking/src/hooks/useStake.ts b/packages/apps/staking/src/hooks/useStake.ts index c413b7c9b7..c9bfbc8ca7 100644 --- a/packages/apps/staking/src/hooks/useStake.ts +++ b/packages/apps/staking/src/hooks/useStake.ts @@ -109,12 +109,12 @@ export const useStake = () => { try { checkSupportedChain(); - if (stakingClient && amount) { + if (stakingClient && amount && address) { const weiAmount = ethers.parseUnits(amount, 'ether'); await stakingClient.approveStake(weiAmount); await stakingClient.stake(weiAmount); await fetchStakingData(stakingClient); - await fetchTokenBalance(browserProvider, address!, chainId); + await fetchTokenBalance(browserProvider, address, chainId); openSnackbar('Stake successful', 'success'); } } catch (error) { @@ -128,11 +128,11 @@ export const useStake = () => { try { checkSupportedChain(); - if (stakingClient && amount) { + if (stakingClient && amount && address) { const weiAmount = ethers.parseUnits(amount, 'ether'); await stakingClient.unstake(weiAmount); await fetchStakingData(stakingClient); - await fetchTokenBalance(browserProvider, address!, chainId); + await fetchTokenBalance(browserProvider, address, chainId); openSnackbar('Unstake successful', 'success'); } } catch (error) { @@ -146,10 +146,10 @@ export const useStake = () => { try { checkSupportedChain(); - if (stakingClient) { + if (stakingClient && address) { await stakingClient.withdraw(); await fetchStakingData(stakingClient); - await fetchTokenBalance(browserProvider, address!, chainId); + await fetchTokenBalance(browserProvider, address, chainId); openSnackbar('Withdraw successful', 'success'); } } catch (error) { From 3c85a25215599fa2cf01540474fdbfcb0ba2ab2e Mon Sep 17 00:00:00 2001 From: kirill Date: Fri, 25 Jul 2025 13:24:18 +0300 Subject: [PATCH 4/4] chore: add walletconnect_project_id to env example --- packages/apps/staking/.env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/apps/staking/.env.example b/packages/apps/staking/.env.example index 6108cf5bc5..e9daab498c 100644 --- a/packages/apps/staking/.env.example +++ b/packages/apps/staking/.env.example @@ -2,6 +2,7 @@ VITE_APP_DASHBOARD_API_URL=http://0.0.0.0:5006 VITE_APP_ENVIRONMENT=testnet VITE_APP_SUPPORTED_CHAINS=80002 +VITE_APP_WALLETCONNECT_PROJECT_ID=replace-me # Links to header VITE_HEADER_LINK_DASHBOARD=http://localhost:3004