UNPKG

@knine-sdk/react

Version:

React helpers for Knine Finance projects. Part of Knine JS SDK

48 lines (45 loc) 2.2 kB
import invariant from 'tiny-invariant'; import warning from 'tiny-warning'; import { useEffect } from 'react'; import { getERC20Contract } from '@knine-sdk/contracts'; import { useContractSWR } from './useContractSWR.js'; import { useSDK } from './useSDK.js'; import { useDebounceCallback } from './useDebounceCallback.js'; const useTokenBalance = (token, account, config, providerRpc, web3Provider) => { const { providerRpc: sdkProviderRpc, providerWeb3: sdkProviderWeb3, account: sdkAccount, } = useSDK(); const mergedAccount = account !== null && account !== void 0 ? account : sdkAccount; const chosenRpcProvider = providerRpc !== null && providerRpc !== void 0 ? providerRpc : sdkProviderRpc; const chosenWeb3Provider = web3Provider !== null && web3Provider !== void 0 ? web3Provider : sdkProviderWeb3; invariant(token != null, 'Token is required'); const contractRpc = getERC20Contract(token, chosenRpcProvider); const contractWeb3 = chosenWeb3Provider ? getERC20Contract(token, chosenWeb3Provider) : null; const result = useContractSWR({ shouldFetch: !!mergedAccount, contract: contractRpc, method: 'balanceOf', params: [mergedAccount], config, }); const updateBalanceDebounced = useDebounceCallback(result.update, 1000); useEffect(() => { if (!mergedAccount || !chosenWeb3Provider || !contractWeb3) return; try { const fromMe = contractWeb3.filters.Transfer(mergedAccount, null); const toMe = contractWeb3.filters.Transfer(null, mergedAccount); chosenWeb3Provider.on(fromMe, updateBalanceDebounced); chosenWeb3Provider.on(toMe, updateBalanceDebounced); return () => { chosenWeb3Provider.off(fromMe, updateBalanceDebounced); chosenWeb3Provider.off(toMe, updateBalanceDebounced); }; } catch (error) { return warning(false, 'Cannot subscribe to events'); } }, [chosenWeb3Provider, contractWeb3, mergedAccount, updateBalanceDebounced]); return result; }; export { useTokenBalance };