@knine-sdk/react
Version:
React helpers for Knine Finance projects. Part of Knine JS SDK
48 lines (45 loc) • 2.2 kB
JavaScript
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 };