diff --git a/src/components/wallet/use-fetch-wallet-balance.ts b/src/components/wallet/use-fetch-wallet-balance.ts index db844a32..88622abf 100644 --- a/src/components/wallet/use-fetch-wallet-balance.ts +++ b/src/components/wallet/use-fetch-wallet-balance.ts @@ -11,21 +11,22 @@ type WalletBalanceType = { export const useFetchWalletBalance = (addressOrName: string | undefined) => { const [userBalance, setUserBalance] = useState() - const { data: iqData, refetch: refetchIqData } = useBalance({ + //get native balance + const { data: coinData, refetch: refetchCoinData } = useBalance({ address: addressOrName as `0x${string}`, - token: config.iqAddress as `0x${string}`, }) - - const { data: maticData, refetch: refetchMaticData } = useBalance({ + //get erc20 balance + const { data: erc20Balance, refetch: refetchErc20Balance } = useBalance({ address: addressOrName as `0x${string}`, + token: config.erc20IQConfig.address, }) const isFeteched = useRef(false) const refreshBalance = async () => { - const newIqData = refetchIqData() - const newMaticData = refetchMaticData() - const response = await Promise.all([newIqData, newMaticData]) + const newIqData = refetchCoinData() + const newErc20Data = refetchErc20Balance() + const response = await Promise.all([newIqData, newErc20Data]) const convertedResult: WalletBalanceType[] = response.map((res) => ({ data: { formatted: res.data?.formatted, @@ -36,24 +37,24 @@ export const useFetchWalletBalance = (addressOrName: string | undefined) => { } useEffect(() => { - if (iqData && maticData && !isFeteched.current) { + if (coinData && erc20Balance && !isFeteched.current) { const convertedIqData = { data: { - formatted: iqData?.formatted, - symbol: iqData?.symbol, + formatted: coinData?.formatted, + symbol: coinData?.symbol, }, } - const convertedMaticData = { + const convertedErc20Data = { data: { - formatted: maticData?.formatted, - symbol: maticData?.symbol, + formatted: erc20Balance?.formatted, + symbol: erc20Balance?.symbol, }, } - const result = [convertedIqData, convertedMaticData] + const result = [convertedIqData, convertedErc20Data] setUserBalance(result) isFeteched.current = true } - }, [iqData, maticData]) + }, [coinData, erc20Balance]) return { userBalance, refreshBalance } as const } diff --git a/src/config/index.ts b/src/config/index.ts index 2075206d..fbdf5c53 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -1,29 +1,34 @@ +import erc20Abi from '@/abis/erc20.abi' + const config = { wikiContractAddress: process.env.NEXT_PUBLIC_WIKI_CONTRACT_ADDRESS || - '0x94bb4c72252d0ae7a98b2b0483Dc4145C0C79059', + '0xCFca7c16155DCff806f665E0C9b73281fCe62b7d', iqAddress: process.env.NEXT_PUBLIC_IQ_ADDRESS || - '0x0552D756a3E92Aa874EF60F61b7a29030373e869', + '0x579CEa1889991f68aCc35Ff5c3dd0621fF29b0C9', + wiqAddress: + process.env.NEXT_PUBLIC_WIQ_ADDRESS || + '0x4Af20e15F5959A5Db8fA7Fa957DAc60eae7AFC22', hiiqAddress: process.env.NEXT_PUBLIC_HIIQ_ADDRESS || - '0xC03bCACC5377b7cc6634537650A7a1D14711c1A3', + '0x1396C8aDD1212784F6534D7938DC534aF448FA2C', treasuryHiIQAddress: process.env.NEXT_PUBLIC_TREASURY_HIIQ_ADDRESS || '0xaCa39B187352D9805DECEd6E73A3d72ABf86E7A0', hiiqRewardAddress: process.env.NEXT_PUBLIC_HIIQREWARDS_ADDRESS || - '0x36Cae8d96CBB53e139628e63E47ebe2B47a53f1f', + '0xb61bC70681bbDf8C4e5eE9F0ef3654F0aC0f7D1E', blockExplorerUrl: process.env.NEXT_PUBLIC_BLOCK_EXPLORER_BASE_URL || - 'https://goerli.etherscan.io/', + 'https://testnet.braindao.org', infuraId: process.env.NEXT_PUBLIC_INFURA_ID, alchemyApiKey: String(process.env.NEXT_PUBLIC_ALCHEMY_API_KEY), - alchemyChain: process.env.NEXT_PUBLIC_ALCHEMY_CHAIN || 'goerli', + alchemyChain: process.env.NEXT_PUBLIC_ALCHEMY_CHAIN || 'iqTestnet', graphqlUrl: process.env.NEXT_PUBLIC_EP_API || 'https://api.dev.braindao.org/graphql', - chainId: process.env.NEXT_PUBLIC_CHAIN_ID || '5', - chainName: process.env.NEXT_PUBLIC_CHAIN_NAME || 'goerli', + chainId: process.env.NEXT_PUBLIC_CHAIN_ID || '313377', + chainName: process.env.NEXT_PUBLIC_CHAIN_NAME || 'iqTestnet', ensRPC: String(process.env.NEXT_PUBLIC_ENS_RPC), publicDomain: String(process.env.NEXT_PUBLIC_DOMAIN), treasuryAddress: process.env.NEXT_PUBLIC_TREASURY_ADDRESS, @@ -50,6 +55,15 @@ const config = { cmcApiKey: process.env.NEXT_PUBLIC_CMC_API_KEY, walletConnectProjectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID || '', + isProd: process.env.NEXT_PUBLIC_IS_PROD === 'true', + erc20IQConfig: { + address: + //use WIQ for dev + process.env.NEXT_PUBLIC_IS_PROD === 'true' + ? (process.env.NEXT_PUBLIC_IQ_ADDRESS as `0x${string}`) + : (process.env.NEXT_PUBLIC_WIQ_ADDRESS as `0x${string}`), + abi: erc20Abi, + }, } export default config diff --git a/src/config/wagmi.ts b/src/config/wagmi.ts index 4131bb6a..5ce6c5fd 100644 --- a/src/config/wagmi.ts +++ b/src/config/wagmi.ts @@ -2,20 +2,50 @@ import { WalletConnectConnector } from '@wagmi/core/connectors/walletConnect' import { MetaMaskConnector } from '@wagmi/core/connectors/metaMask' import { mainnet } from 'wagmi' import { configureChains } from '@wagmi/core' -import { goerli } from 'wagmi/chains' import { alchemyProvider } from '@wagmi/core/providers/alchemy' import { publicProvider } from '@wagmi/core/providers/public' +import { jsonRpcProvider } from '@wagmi/core/providers/jsonRpc' +import { defineChain } from 'viem' import config from './index' type Connector = MetaMaskConnector | WalletConnectConnector -const chainArray = config.alchemyChain === 'goerli' ? goerli : mainnet +export const iqTestnet = defineChain({ + id: 313_377, + name: 'IQ Testnet', + network: 'IQ Testnet', + nativeCurrency: { + name: 'IQ Token', + symbol: 'IQ', + decimals: 18, + }, + rpcUrls: { + default: { http: ['https://rpc-testnet.braindao.org/'] }, + public: { http: ['https://rpc-testnet.braindao.org/'] }, + }, + blockExplorers: { + default: { name: 'BrainScan', url: config.blockExplorerUrl }, + }, + testnet: true, +}) + +export const { chains, publicClient, webSocketPublicClient } = config.isProd + ? configureChains( + [mainnet], + [alchemyProvider({ apiKey: config.alchemyApiKey }), publicProvider()], + ) + : configureChains( + [iqTestnet], + [ + jsonRpcProvider({ + rpc: (chain) => ({ + http: chain.rpcUrls.default.http[0], + }), + }), + ], + ) -export const { chains, publicClient, webSocketPublicClient } = configureChains( - [chainArray], - [alchemyProvider({ apiKey: config.alchemyApiKey }), publicProvider()], -) export const connectors: Connector[] = [ new MetaMaskConnector({ chains, options: { shimDisconnect: true } }), new WalletConnectConnector({ diff --git a/src/data/LockConstants.tsx b/src/data/LockConstants.tsx index 53df4da9..4c8e3cbc 100644 --- a/src/data/LockConstants.tsx +++ b/src/data/LockConstants.tsx @@ -1,12 +1,15 @@ import config from '@/config' +const TESTNET_GAS_LIMIT = 10_000_000 export const YEARS_LOCK = 4 -export const YIELD_GAS_LIMIT = 185000 -export const CHECKPOINT_GAS_LIMIT = 220000 -export const LOCK_UPDATE_GAS_LIMIT = 440000 -export const LOCK_AND_WITHDRAWAL_GAS_LIMIT = 490000 -export const DEFAULT_GAS_LIMIT = 170000 -export const APPROVE = 50000 +export const YIELD_GAS_LIMIT = config.isProd ? 185_000 : TESTNET_GAS_LIMIT +export const CHECKPOINT_GAS_LIMIT = config.isProd ? 220_000 : TESTNET_GAS_LIMIT +export const LOCK_UPDATE_GAS_LIMIT = config.isProd ? 440000 : TESTNET_GAS_LIMIT +export const LOCK_AND_WITHDRAWAL_GAS_LIMIT = config.isProd + ? 490000 + : TESTNET_GAS_LIMIT +export const DEFAULT_GAS_LIMIT = config.isProd ? 170000 : TESTNET_GAS_LIMIT +export const APPROVE = config.isProd ? 50000 : TESTNET_GAS_LIMIT export const EP_COINGECKO_URL = 'https://api.coingecko.com/api/v3/simple/price?ids=everipedia&vs_currencies=usd' export const EP_COINGECKO_BASE_URL = 'https://api.coingecko.com/api/v3/simple' diff --git a/src/hooks/useErc20.ts b/src/hooks/useErc20.ts index 567a5a0c..5eed4ca5 100644 --- a/src/hooks/useErc20.ts +++ b/src/hooks/useErc20.ts @@ -3,15 +3,14 @@ import { useAccount, useBalance } from 'wagmi' export const useErc20 = () => { const { address } = useAccount() - const { data: erc20Balance, refetch: refetchErc20Balance } = useBalance({ address: address, - token: config.iqAddress as `0x${string}`, + token: config.erc20IQConfig.address, }) const { data: totalValueLocked } = useBalance({ address: config.hiiqAddress as `0x${string}`, - token: config.iqAddress as `0x${string}`, + token: config.erc20IQConfig.address, }) const getUserBalance = () => { diff --git a/src/hooks/useLock.ts b/src/hooks/useLock.ts index 05e20885..df3f337b 100644 --- a/src/hooks/useLock.ts +++ b/src/hooks/useLock.ts @@ -2,18 +2,12 @@ import hiIQABI from '@/abis/hiIQABI.abi' import config from '@/config' import { useAccount, useContractRead, useContractWrite } from 'wagmi' import { waitForTransaction } from 'wagmi/actions' -import erc20Abi from '@/abis/erc20.abi' const hiiqContractConfig = { address: config.hiiqAddress as `0x${string}`, abi: hiIQABI, } -const erc20ContractConfig = { - address: config.iqAddress as `0x${string}`, - abi: erc20Abi, -} - export const useLock = () => { const { address } = useAccount() @@ -39,13 +33,13 @@ export const useLock = () => { const { data: allowanceToken, refetch: refetchedAllowanceToken } = useContractRead({ - ...erc20ContractConfig, + ...config.erc20IQConfig, functionName: 'allowance', args: [address as `0x${string}`, config.hiiqAddress as `0x${string}`], }) const { writeAsync: approve } = useContractWrite({ - ...erc20ContractConfig, + ...config.erc20IQConfig, functionName: 'approve', })