UNPKG

@openocean.finance/widget

Version:

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

67 lines 2.95 kB
import { useAccount } from '@openocean.finance/wallet-management'; import { keepPreviousData, useQuery } from '@tanstack/react-query'; import { parseUnits } from 'viem'; import { useFieldValues } from '../stores/form/useFieldValues.js'; import { useTokenAddressBalance } from './useTokenAddressBalance.js'; const refetchInterval = 30000; export const useGasSufficiencyBridge = (route) => { const [fromChainId, fromTokenAddress, fromAmount] = useFieldValues('fromChain', 'fromToken', 'fromAmount'); let chainId = fromChainId; let tokenAddress = fromTokenAddress; if (route) { chainId = route.fromToken.chainId; tokenAddress = route.fromToken.address; } const { token, chain, isLoading: isTokenAddressBalanceLoading, } = useTokenAddressBalance(chainId, tokenAddress); const { account } = useAccount({ chainType: chain?.chainType }); const { data: insufficientBridge, isLoading } = useQuery({ queryKey: [ 'bridge-sufficiency-check', account.address, chainId, tokenAddress, route?.id ?? fromAmount, ], queryFn: async ({ queryKey: [, accountAddress] }) => { if (!accountAddress || !token) { return; } const parsedFromAmount = parseUnits(fromAmount, token.decimals); let currentTokenBalance = token.amount ?? 0n; if (!route) { return false; } if (route.fromChainId !== route.toChainId) { const prependedOperatingExpenseCost = route.data.prependedOperatingExpenseCost || 0n; let gas = BigInt(Number.parseInt((1.1 * Number(prependedOperatingExpenseCost)).toString())); if (chain?.nativeToken?.address === fromTokenAddress) { if (fromChainId === 1151111081099710) { gas += 15000000n + (8157120n + 4000000n + 890880n); } else if (fromChainId === 8453) { gas += 1000000000000000n + 1000000000000n; } } if (currentTokenBalance > gas) { currentTokenBalance = currentTokenBalance - gas; } else { currentTokenBalance = 0n; } const insufficientFunds = BigInt(parsedFromAmount) > currentTokenBalance && BigInt(parsedFromAmount) < token.amount; return insufficientFunds; } return false; }, enabled: Boolean(account.address && token && !isTokenAddressBalanceLoading), refetchInterval, staleTime: refetchInterval, placeholderData: account.address ? keepPreviousData : undefined, }); return { insufficientBridge, isLoading, }; }; //# sourceMappingURL=useGasSufficiencyBridge.js.map