import { useWeb3React } from '@web3-react/core' import { queryClient } from '../pages/_app' import { Erc20, NEXT_PUBLIC_TOKEN_SYMBOL } from '../configs' import { Token } from '../configs/tokens/types' import { bigNumberToDecimal, decimalToBigNumber } from '../utils/bigNumber' import { getContractKey, serializesContractKey, useMutationContract, useQueryContract } from './contracts' import { useTokenContract } from './useContract' import { DEFAULT_INCREASE_ALLOWANCE_VALUE } from '../constants' export type AllowanceVariables = { contractParams?: { spenderAddress: string increaseAllowanceValue: string } otherParams?: {} } const useTokenAllowance = (token: Token, spenderAddress: string, dependency?: any) => { const { account } = useWeb3React() const TokenContract = useTokenContract(token.tokenAddress) const increaseAllowanceMutation = useMutationContract({ contract: TokenContract as Erc20, methodName: 'increaseAllowance', callback: ({ variables, data }) => { const serializedKeys = serializesContractKey({ contract: TokenContract as Erc20, methodName: 'allowance', variables: { account, spenderAddress, }, }) queryClient.setQueryData([serializedKeys], () => parseInt(bigNumberToDecimal(variables.contractParams.increaseAllowanceValue)), ) }, }) const allowanceQuery = useQueryContract( { contract: TokenContract as Erc20, methodName: 'allowance', variables: { account, spenderAddress, }, }, { initialData: 0, select: (data) => parseInt(bigNumberToDecimal(data.toString()), 10), enabled: account && token.tokenSymbol !== NEXT_PUBLIC_TOKEN_SYMBOL, }, ) // /** // * increase allowance with default value is DEFAULT_INCREASE_ALLOWANCE_VALUE = 1000000000 // */ // const increaseAllowance = useCallback( // (increaseAllowanceValue = DEFAULT_INCREASE_ALLOWANCE_VALUE) => { // dispatch( // userActions.increaseAllowance({ // TokenContract, // spenderAddress, // increaseAllowanceValue: decimalToBigNumber(increaseAllowanceValue), // callback: () => setAllowance(increaseAllowanceValue + allowance), // }), // ) // }, // [TokenContract, allowance, dispatch, spenderAddress], // ) return { allowance: token.tokenSymbol === NEXT_PUBLIC_TOKEN_SYMBOL ? DEFAULT_INCREASE_ALLOWANCE_VALUE : allowanceQuery.data, increaseAllowance: () => increaseAllowanceMutation.mutate({ contractParams: { spenderAddress, increaseAllowanceValue: decimalToBigNumber(DEFAULT_INCREASE_ALLOWANCE_VALUE), }, }), loadingIncreaseAllowance: allowanceQuery.isFetching, loadingGetAllowance: increaseAllowanceMutation.isLoading, allowanceQuery, increaseAllowanceMutation, } } export default useTokenAllowance