Skip to content
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

Add IQ Testnet #263

Merged
merged 15 commits into from
May 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions src/components/wallet/use-fetch-wallet-balance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,22 @@ type WalletBalanceType = {

export const useFetchWalletBalance = (addressOrName: string | undefined) => {
const [userBalance, setUserBalance] = useState<WalletBalanceType[]>()
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,
Expand All @@ -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
}
30 changes: 22 additions & 8 deletions src/config/index.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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
42 changes: 36 additions & 6 deletions src/config/wagmi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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/'] },
kesar marked this conversation as resolved.
Show resolved Hide resolved
},
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({
Expand Down
15 changes: 9 additions & 6 deletions src/data/LockConstants.tsx
Original file line number Diff line number Diff line change
@@ -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'
Expand Down
5 changes: 2 additions & 3 deletions src/hooks/useErc20.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = () => {
Expand Down
10 changes: 2 additions & 8 deletions src/hooks/useLock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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',
})

Expand Down
Loading