import { useQuery, type UseQueryResult } from '@tanstack/react-query'; import { useSodaxContext } from '../shared/useSodaxContext.js'; import type { CreateBridgeIntentParams, GetWalletProviderType, SpokeChainKey } from '@sodax/sdk'; import type { ReadHookParams } from '../shared/types.js'; export type UseBridgeAllowanceParams = ReadHookParams< boolean, { payload: CreateBridgeIntentParams | undefined; walletProvider: GetWalletProviderType | undefined; } >; export function useBridgeAllowance({ params, queryOptions, }: UseBridgeAllowanceParams = {}): UseQueryResult { const { sodax } = useSodaxContext(); const payload = params?.payload; const walletProvider = params?.walletProvider; return useQuery({ // Extract the (chain, owner, token, amount) tuple that actually scopes the allowance — // raw-object keys break per Rule 4 (bigints) and churn on every render. queryKey: [ 'bridge', 'allowance', payload?.srcChainKey, payload?.srcAddress, payload?.srcToken, payload?.amount?.toString(), ], queryFn: async () => { if (!payload || !walletProvider) { return false; } const result = await sodax.bridge.isAllowanceValid({ params: payload, raw: false, walletProvider, }); return result.ok ? result.value : false; }, enabled: !!payload && !!walletProvider, refetchInterval: 2000, gcTime: 0, ...queryOptions, }); }