UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

57 lines 2.9 kB
import { useAccount } from '@lifi/wallet-management'; import { useMemo } from 'react'; import { useFieldValues } from '../stores/form/useFieldValues.js'; import { useAvailableChains } from './useAvailableChains.js'; import { useGasRecommendation } from './useGasRecommendation.js'; import { useIsContractAddress } from './useIsContractAddress.js'; import { useTokenBalance } from './useTokenBalance.js'; export const useGasRefuel = () => { const { getChainById } = useAvailableChains(); const [fromChainId, fromTokenAddress, toChainId, toAddress] = useFieldValues('fromChain', 'fromToken', 'toChain', 'toAddress'); const toChain = getChainById(toChainId); const fromChain = getChainById(fromChainId); const { account: toAccount } = useAccount({ chainType: toChain?.chainType }); const effectiveToAddress = toAddress || toAccount?.address; const { isContractAddress: isToContractAddress } = useIsContractAddress(effectiveToAddress, toChainId, toChain?.chainType); const { token: destinationNativeToken } = useTokenBalance(effectiveToAddress, toChainId ? toChain?.nativeToken : undefined); const { data: gasRecommendation, isLoading } = useGasRecommendation(toChainId, fromChainId, fromTokenAddress); // When we bridge between ecosystems we need to be sure toAddress is set const isChainTypeSatisfied = fromChain?.chainType !== toChain?.chainType ? Boolean(toAddress) : true; // We should not refuel to the contract address const isToAddressSatisfied = effectiveToAddress && !isToContractAddress; const enabled = useMemo(() => { if ( // Same chain refuel is not allowed since users need gas on source chain to initiate transaction // We allow refuel when bridging to native token since bridging routes may require gas for destination swaps fromChainId === toChainId || !gasRecommendation?.available || !gasRecommendation?.recommended || !destinationNativeToken || !isChainTypeSatisfied || !isToAddressSatisfied) { return false; } const tokenBalance = destinationNativeToken.amount ?? 0n; // Check if the user balance < 50% of the recommended amount const recommendedAmount = BigInt(gasRecommendation.recommended.amount) / 2n; const insufficientGas = tokenBalance < recommendedAmount; return insufficientGas; }, [ fromChainId, gasRecommendation, isChainTypeSatisfied, isToAddressSatisfied, destinationNativeToken, toChainId, ]); return { enabled: enabled, availble: gasRecommendation?.available, isLoading: isLoading, chain: toChain, fromAmount: gasRecommendation?.available ? gasRecommendation.fromAmount : undefined, }; }; //# sourceMappingURL=useGasRefuel.js.map