wagmi-extended 2.1.1 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/hooks/mutations/useInvalidateQueries.ts","../src/utils/errorParserX.ts","../src/hooks/mutations/useHandleTransactionMutationX.ts","../src/hooks/mutations/useContractWriteX.ts","../src/hooks/mutations/useSendTransactionX.ts","../src/query-config/index.ts","../src/config/defaults.ts","../src/utils/ensureClientAndConfig.ts","../src/fetch-functions/erc20/fetchAllowanceX.ts","../src/hooks/queries/useFetchAssetAllowanceX.ts","../src/hooks/mutations/useERC20ApproveX.ts","../src/fetch-functions/fetchTokenX.ts","../src/hooks/queries/useTokenX.ts","../src/fetch-functions/erc20/fetchBalanceOfX.ts","../src/fetch-functions/erc20/fetchTotalSupplyX.ts","../src/fetch-functions/erc20/fetchERC20DataX.ts","../src/fetch-functions/erc4626/fetchERC4626AssetX.ts","../src/fetch-functions/erc4626/fetchERC4626TotalAssetsX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxDepositX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxMintX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxRedeemX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxWithdrawX.ts","../src/fetch-functions/erc4626/fetchERC4626DataX.ts"],"sourcesContent":["import { QueryKey, useQueryClient } from \"@tanstack/react-query\";\n\n/**\n * Hook to invalidate multiple queries in the React Query cache.\n *\n * @returns An object with the invalidateMany function.\n */\nexport function useInvalidateQueries() {\n const queryClient = useQueryClient();\n\n const invalidateMany = async (queries: (QueryKey | undefined)[]) => {\n const promises = queries.map((queryKey) =>\n queryClient.invalidateQueries({ queryKey })\n );\n await Promise.all(promises);\n };\n\n return { invalidateMany };\n}\n","import { BaseError, ContractFunctionRevertedError } from \"viem\";\n\n/**\n * Default error mapping that contains a set of error identifiers mapped to user-friendly error messages.\n */\nconst defaultErrorMapping: Record<string, string> = {\n EnforcedPause: \"Temporary pause in effect, please check Discord for updates.\",\n ErrorNotEnoughAllowance:\n \"Not enough allowance, did you approve your tokens first?\",\n \"0xc2139725\": \"Not enough allowance, did you approve your tokens first?\",\n SharesReceivedBelowMinimum:\n \"Action exceeded safe slippage parameters, please try again later\",\n \"0xea8d7f02\":\n \"Action exceeded safe slippage parameters, please try again later\",\n MaxSlippageExceeded:\n \"Action exceeded safe slippage parameters, please try again later\",\n \"51\": \"Supply cap exceeded\",\n};\n\n/**\n * A mutable copy of the default error mapping that can be extended or overridden by users.\n */\nlet currentErrorMapping: Record<string, string> = { ...defaultErrorMapping };\n\n/**\n * Merges a custom error mapping into the current error mapping.\n * Custom values override any existing keys.\n *\n * @param customMapping - An object containing error keys and the corresponding custom messages.\n *\n * @example\n * setErrorMapping({\n * ErrorNotEnoughAllowance: \"Custom message: Please approve tokens first!\",\n * NewCustomError: \"A custom error occurred.\"\n * });\n */\nexport const setErrorMapping = (\n customMapping: Record<string, string>\n): void => {\n currentErrorMapping = { ...currentErrorMapping, ...customMapping };\n};\n\n/**\n * Resets the current error mapping to the default error mapping.\n *\n * @example\n * resetErrorMapping();\n */\nexport const resetErrorMapping = (): void => {\n currentErrorMapping = {};\n};\n\n/**\n * Retrieves the current error mapping.\n *\n * @returns The current error mapping object.\n *\n * @example\n * const mapping = getErrorMapping();\n * console.log(mapping);\n */\nexport const getErrorMapping = (): Record<string, string> =>\n currentErrorMapping;\n\n/**\n * Parses an error object and returns a user-friendly error message.\n *\n * The function checks if the error is a ContractFunctionRevertedError by attempting to walk through\n * the error using its `walk` method. If a matching error is found and its error key exists in the\n * current error mapping, the corresponding custom message will be returned. Otherwise, it falls back\n * to the error's own message properties.\n *\n * @param error - The error object, potentially including additional error details.\n * @returns A user-friendly error message.\n *\n * @example\n * const message = getParsedError(someError);\n * console.log(message); // Outputs a custom error message or a default error message.\n */\nexport const getParsedErrorX = (error: any | BaseError): string => {\n const defaultMessage = \"An unknown error occurred. Please contact support.\";\n let message = defaultMessage;\n let errorKey = \"\";\n\n const revertedError = error?.walk\n ? error.walk((err: unknown) => err instanceof ContractFunctionRevertedError)\n : null;\n if (revertedError instanceof ContractFunctionRevertedError) {\n errorKey =\n revertedError.data?.errorName ??\n revertedError.signature ??\n revertedError.reason ??\n \"\";\n if (currentErrorMapping[errorKey]) return currentErrorMapping[errorKey];\n }\n\n message = error.shortMessage || error.details || error.message || message;\n return message;\n};\n","import { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { useConfig } from \"wagmi\";\nimport { Query, QueryKey } from \"@tanstack/query-core\";\nimport { Address } from \"viem\";\nimport { useState } from \"react\";\nimport { useInvalidateQueries } from \"./useInvalidateQueries.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { getParsedErrorX } from \"../../utils/errorParserX.js\";\n\nexport type WriteExtendedAsyncParams = {\n onSuccess?: (txHash: Address) => void;\n onError?: (e: any) => void;\n onSettled?: () => void;\n\n onSuccessAsync?: (txHash: Address) => Promise<void>;\n onErrorAsync?: (e: any) => Promise<void>;\n onSettledAsync?: () => Promise<void>;\n\n /** simple list of keys to invalidate */\n queriesToInvalidate?: (QueryKey | undefined)[];\n /** a predicate to decide which queries to invalidate */\n invalidatePredicate?: (query: Query<unknown, unknown>) => boolean;\n\n disableLogging?: boolean;\n disableWaitingForReceipt?: boolean;\n};\n\n/**\n * Custom hook to handle transaction mutations.\n *\n * @returns {Function} A shared `onSettled` callback for transaction mutations.\n */\nexport function useHandleTransactionMutationX({\n settings,\n}: {\n settings?: WriteExtendedAsyncParams;\n}) {\n const wagmiConfig = useConfig();\n const queryClient = useQueryClient();\n\n const { invalidateMany } = useInvalidateQueries();\n const [isPending, setIsPending] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string | undefined>(\n undefined\n );\n\n const onMutate = () => {\n setIsPending(true);\n setErrorMessage(undefined);\n };\n\n const onSettled = async (\n txHash: Address | undefined,\n error: any,\n args: any\n ) => {\n try {\n if (error) throw error;\n\n if (!settings?.disableWaitingForReceipt) {\n // 1. wait for transaction receipt\n const txReceipt = await waitForTransactionReceipt(wagmiConfig, {\n hash: txHash!,\n });\n\n // 2. throw if receipt is not valid\n if (txReceipt.status === \"reverted\")\n throw new Error(\"Execution reverted.\");\n if (txReceipt.status !== \"success\")\n throw new Error(\"Execution reverted.\");\n }\n\n // 3. invalidate queries\n const { queriesToInvalidate, invalidatePredicate } = settings || {};\n\n if (invalidatePredicate) {\n // 1) predicate-based\n await queryClient.invalidateQueries({\n predicate: invalidatePredicate,\n });\n }\n if (queriesToInvalidate) {\n // 2) explicit key list\n await invalidateMany(queriesToInvalidate);\n }\n\n // 4. call onSuccess callback\n settings?.onSuccess?.(txHash!);\n if (settings?.onSuccessAsync) await settings.onSuccessAsync(txHash!);\n\n if (!settings?.disableLogging) {\n // 5. log result\n // eslint-disable-next-line no-console\n console.info(\"Operation successful:\", txHash); // todo: add logging service\n }\n // 6. return result\n return txHash;\n } catch (error) {\n const parsedError = getParsedErrorX(error);\n\n if (!settings?.disableLogging) {\n // 1. log error\n console.error(\n `ContractWriteExtended Operation failed with error(parsed): ${parsedError}`,\n { error },\n { args }\n );\n console.error({ error });\n }\n // 2. set error message\n setErrorMessage(parsedError);\n\n // 3. call callback\n settings?.onError?.(error);\n if (settings?.onErrorAsync) await settings.onErrorAsync(error);\n } finally {\n setIsPending(false);\n // 1. call callback\n settings?.onSettled?.();\n if (settings?.onSettledAsync) await settings.onSettledAsync();\n }\n return undefined;\n };\n\n return {\n onMutate,\n onSettled,\n isPending,\n errorMessage,\n };\n}\n","import { usePublicClient, useSimulateContract, useWriteContract } from \"wagmi\";\nimport {\n WriteExtendedAsyncParams,\n useHandleTransactionMutationX,\n} from \"./useHandleTransactionMutationX.js\";\nimport { Address } from \"viem\";\n\n/**\n * Custom hook for writing to a smart contract using Wagmi with optional simulation.\n *\n * @param {WriteExtendedAsyncParams} settings - Settings for handling transaction lifecycle:\n * @param {boolean} [settings.disableWaitingForReceipt] - Disable waiting for receipt.\n * @param {boolean} [settings.disableLogging] - Disable logging.\n * @param {Function} [settings.onSuccess] - Callback invoked on successful transaction receipt.\n * @param {Function} [settings.onError] - Callback invoked on simulation or transaction error.\n * @param {Function} [settings.onSettled] - Callback invoked after transaction settles.\n * @param {Array<import('@tanstack/query-core').QueryKey>} [settings.queriesToInvalidate] - Query keys to invalidate after receipt.\n * @returns {Object} An object containing:\n * - writeContract: Wagmi's writeContract function.\n * - writeContractX: Wrapped writeContract with optional simulation.\n * - isPending: Boolean indicating if transaction is in progress.\n * - errorMessage: Error message if one occurred.\n *\n * @example\n * const { writeContractX, isPending, errorMessage } = useContractWriteX({ onSuccess: ..., onError: ... });\n * await writeContractX(\n * { abi, address, functionName, args, account, chain, value },\n * disable simulation? = false\n * );\n */\nexport function useContractWriteX(settings: WriteExtendedAsyncParams) {\n const publicClient = usePublicClient();\n\n const { isPending, errorMessage, onMutate, onSettled } =\n useHandleTransactionMutationX({ settings });\n\n // Underlying Wagmi write hook:\n const wagmiWrite = useWriteContract({\n mutation: { onMutate, onSettled },\n });\n\n async function writeContractX(\n params: Parameters<typeof wagmiWrite.writeContract>[0],\n disableSimulation = false\n ) {\n // 0) signal start\n onMutate();\n\n try {\n // 1) optional dry-run\n const { chain, ...others } = params;\n\n if (!disableSimulation) {\n await publicClient?.simulateContract({\n ...others,\n ...(chain != null ? { chain } : {}),\n });\n }\n\n wagmiWrite.writeContract(params);\n } catch (err) {\n await onSettled(undefined, err, params);\n }\n }\n\n return {\n ...wagmiWrite,\n writeContractX,\n isPending,\n errorMessage,\n };\n}\n","import { usePublicClient, useSendTransaction, useWriteContract } from \"wagmi\";\nimport {\n useHandleTransactionMutationX,\n WriteExtendedAsyncParams,\n} from \"./useHandleTransactionMutationX.js\";\nimport { writeContract } from \"wagmi/actions\";\n\n/**\n * Custom hook for sending a transaction using Wagmi with optional simulation.\n *\n * @param {WriteExtendedAsyncParams} [settings] - Settings for handling transaction lifecycle:\n * @param {boolean} [settings.disableWaitingForReceipt] - Disable waiting for receipt.\n * @param {boolean} [settings.disableLogging] - Disable logging.\n * @param {Function} [settings.onSuccess] - Callback on success.\n * @param {Function} [settings.onError] - Callback on error.\n * @param {Function} [settings.onSettled] - Callback after settlement.\n * @param {Array<import('@tanstack/query-core').QueryKey>} [settings.queriesToInvalidate] - Query keys to invalidate after receipt.\n * @returns {Object} An object containing:\n * - sendTransaction: Wagmi's sendTransaction function.\n * - sendTransactionX: Wrapped sendTransaction with optional simulation.\n * - isPending: Boolean indicating if transaction is in progress.\n * - errorMessage: Error message if one occurred.\n *\n * @example\n * const { sendTransactionX, isPending, errorMessage } = useSendTransactionX({ onSuccess: ..., onError: ... });\n * await sendTransactionX(\n * { to, value, data, account, chain },\n * { abi, functionName, args, chain }\n * );\n */\nexport function useSendTransactionX(settings?: WriteExtendedAsyncParams) {\n const publicClient = usePublicClient();\n\n const { isPending, errorMessage, onMutate, onSettled } =\n useHandleTransactionMutationX({\n settings,\n });\n\n const { sendTransaction, ...rest } = useSendTransaction({\n mutation: {\n onMutate,\n onSettled,\n },\n });\n\n /**\n * Wraps sendTransaction with an optional simulation step.\n *\n * @param {import('viem').SendTransactionParameters} params - Parameters to sendTransaction.\n * @param {import('viem').SimulateContractParameters} [simulationParams] - Optional parameters to simulate contract call:\n * @param {Array|object} simulationParams.abi - Contract ABI for simulation.\n * @param {string} simulationParams.functionName - Name of the contract function to simulate.\n * @param {any[]} [simulationParams.args] - Arguments for the function call.\n * @param {import('viem').Chain} [simulationParams.chain] - Chain to run the simulation on.\n * @returns {Promise<void>}\n */\n async function sendTransactionX(\n params: Parameters<typeof sendTransaction>[0],\n simulationParams?: Parameters<typeof writeContract>[1]\n ) {\n onMutate();\n\n try {\n if (params.to && simulationParams) {\n //simulate!\n await publicClient?.simulateContract({\n address: params.to,\n abi: simulationParams.abi,\n functionName: simulationParams.functionName,\n args: simulationParams.args ?? [],\n account: params.account,\n ...(simulationParams.chain != null\n ? { chain: simulationParams.chain }\n : {}),\n });\n }\n // actual send!\n await sendTransaction(params);\n } catch (err) {\n await onSettled(undefined, err, params);\n }\n }\n\n return {\n ...rest,\n isPending,\n errorMessage,\n sendTransaction,\n sendTransactionX,\n };\n}\n","export const queryConfig = {\n metaDataQuery: {\n staleTime: Number.POSITIVE_INFINITY,\n meta: { category: \"metadata\" } as const,\n },\n lowSensitiveQuery: {\n staleTime: 60_000,\n meta: { category: \"lowSensitive\" } as const,\n },\n semiSensitiveQuery: {\n staleTime: 180_000,\n meta: { category: \"semiSensitive\" } as const,\n },\n expensiveQuery: {\n staleTime: 60 * 60 * 1000,\n meta: { category: \"expensive\" } as const,\n },\n};\n","// src/config/defaults.ts\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { Config } from \"wagmi\";\n\n// You can adjust the type for wagmiConfig to match your needs.\nlet defaultQueryClient: QueryClient | null = null;\nlet defaultWagmiConfig: any = null;\n\n/**\n * Sets the default configuration values.\n *\n * @param queryClient - The default QueryClient instance.\n * @param wagmiConfig - The default Wagmi configuration.\n * @example\n * //In your application initialization (e.g., index.tsx or App.tsx):\n * import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n * import { wagmiConfig } from \"/path/to/wagmi-config\";\n * import { setDefaults } from \"wagmi-extended\";\n *\n * const queryClient = new QueryClient();\n *\n * //Set defaults for the extended library functions.\n * setDefaults(queryClient, wagmiConfig);\n *\n * //Now helper functions like fetchTokenX can use these defaults if no explicit parameters are provided.\n */\nexport function setDefaults(\n queryClient: QueryClient,\n wagmiConfig: Config\n): void {\n defaultQueryClient = queryClient;\n defaultWagmiConfig = wagmiConfig;\n}\n\n/**\n * Retrieves the currently set default configurations.\n *\n * @throws Will throw an error if defaults are not initialized.\n * @returns An object containing the default queryClient and wagmiConfig.\n *\n * @example\n * // Usage in a helper function:\n * import { getDefaults } from \"wagmi-extended\";\n *\n * function exampleFunction() {\n * const { queryClient, wagmiConfig } = getDefaults();\n * // Use queryClient and wagmiConfig as needed...\n * }\n */\nexport function getDefaults(): {\n queryClient: QueryClient;\n wagmiConfig: Config;\n} {\n if (!defaultQueryClient || !defaultWagmiConfig) {\n throw new Error(\n \"Default configuration not set. Please call setDefaults() first.\"\n );\n }\n return { queryClient: defaultQueryClient, wagmiConfig: defaultWagmiConfig };\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Config } from \"wagmi\";\nimport { getDefaults } from \"../config/defaults.js\";\n\nexport function ensureClientAndConfig(\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): { queryClient: QueryClient; wagmiConfig: Config } {\n if (!queryClient || !wagmiConfig) {\n ({ queryClient, wagmiConfig } = getDefaults());\n }\n if (!queryClient || !wagmiConfig) {\n throw new Error(\n \"Could not find queryClient or wagmiConfig; pass them in or setDefaults() first\"\n );\n }\n return { queryClient, wagmiConfig };\n}\n","import { Address, erc20Abi } from \"viem\";\nimport type { Config } from \"wagmi\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchAllowanceX(\n asset: Address,\n spender: Address,\n user: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n) {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const allowance = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: asset,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [user, spender],\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return allowance;\n}\n","import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Address, erc20Abi } from \"viem\";\nimport { useAccount, useConfig } from \"wagmi\";\nimport { fetchAllowanceX } from \"../../fetch-functions/erc20/fetchAllowanceX.js\";\nimport { queryConfig } from \"../../query-config/index.js\";\n\nconst HookFetchAssetAllowanceQK = (\n asset?: Address,\n spender?: Address,\n userAddress?: Address\n) => [\"HookFetchAllowance\", asset, spender, userAddress] as const;\n\n/**\n * Custom hook for fetching asset allowance.\n *\n * @param {Address} asset - The address of the ERC20 token contract.\n * @param {Address} spender - The address of the spender to check allowance for.\n *\n *\n * @example\n * // In your component:\n * function AllowanceDisplay() {\n * const { data: allowance, isLoading, error } = useFetchAssetAllowanceX({\n * asset: \"0xTokenAddressExample\",\n * spender: \"0xSpenderAddressExample\",\n * });\n *\n * if (isLoading) return <div>Loading allowance...</div>;\n * if (error) return <div>Error loading allowance</div>;\n *\n * return (\n * <div>\n * Current Allowance: {allowance}\n * </div>\n * );\n * }\n */\nexport const useFetchAssetAllowanceX = ({\n asset,\n spender,\n}: {\n asset?: Address;\n spender?: Address;\n}) => {\n const config = useConfig();\n const queryClient = useQueryClient();\n const { address: userAddress } = useAccount();\n\n const { data, ...rest } = useQuery({\n queryKey: HookFetchAssetAllowanceQK(asset, spender, userAddress),\n queryFn: () =>\n fetchAllowanceX(asset!, spender!, userAddress!, queryClient, config),\n enabled: Boolean(asset) && Boolean(spender) && Boolean(userAddress),\n ...queryConfig.lowSensitiveQuery,\n });\n\n return {\n ...rest,\n data,\n queryKey: HookFetchAssetAllowanceQK(asset, spender, userAddress),\n };\n};\n","import { useState, useEffect } from \"react\";\nimport { Address, maxUint256, erc20Abi } from \"viem\";\nimport { useFetchAssetAllowanceX } from \"../queries/useFetchAssetAllowanceX.js\";\nimport { useContractWriteX } from \"./useContractWriteX.js\";\n\n/**\n * Custom hook for approving ERC20 token transfers.\n *\n * This hook provides functionality for approving ERC20 token transfers, checking the current allowance, and handling the approval transaction using Wagmi.\n *\n * @param {Address} tokenAddress - The address of the ERC20 token contract (the transfer from).\n * @param {Address} spenderAddress - The address of the spender to approve the transfer to.\n * @param {bigint} [amount=BigInt(0)] - The amount to approve for transfer. Defaults to undefined.\n * @param {boolean} [approveMax=false] - Indicates whether to approve the maximum amount or a specific amount.\n * @returns {Object} Object containing the following properties:\n * - {boolean} isApproved - Indicates whether the spender is already approved to transfer the specified amount of tokens.\n * - {boolean} isApproving - Indicates whether an approval transaction is currently pending.\n * - {Function} approveAsync - Function to trigger the approval transaction.\n *\n * @example\n * // In your component:\n * function ApproveTokenButton(amountToApprove) {\n * const tokenAddress = \"0xTokenAddressExample\";\n * const spenderAddress = \"0xSpenderAddressExample\";\n *\n * const { isApproved, isApproving, justApproved, approveAsync } = useERC20ApproveX(\n * tokenAddress,\n * spenderAddress,\n * parseUnits(amountToApprove.toString(), 18),\n * );\n *\n * return (\n * <button onClick={approveAsync} disabled={isApproving || isApproved}>\n * {isApproving ? \"Approving...\" : isApproved ? \"Approved\" : \"Approve Token\"}\n * </button>\n * );\n * }\n */\n\nexport const useERC20ApproveX = (\n tokenAddress?: Address,\n spenderAddress?: Address,\n amount?: bigint,\n approveMax?: boolean\n) => {\n const [isApproved, setIsApproved] = useState(false);\n const [justApproved, setJustApproved] = useState(false);\n\n const { data: allowance, queryKey: allowanceKQ } = useFetchAssetAllowanceX({\n asset: tokenAddress,\n spender: spenderAddress,\n });\n\n const { writeContractAsync: approveTokenAsync, isPending } =\n useContractWriteX({\n queriesToInvalidate: [allowanceKQ],\n onSuccess: () => {\n setJustApproved(true);\n },\n });\n\n useEffect(() => {\n if (amount == null) {\n setIsApproved(false);\n } else if (allowance && allowance >= amount) {\n setIsApproved(true);\n } else {\n setIsApproved(false);\n }\n }, [allowance, amount]);\n\n const approveAsync = async () => {\n const amountToApprove = approveMax ? maxUint256 : amount;\n\n try {\n if (!spenderAddress) {\n throw new Error(\"spenderAddress is undefined!\");\n }\n if (!tokenAddress) {\n throw new Error(\"tokenAddress is undefined!\");\n }\n if (amountToApprove == null) {\n throw new Error(\"amountToApprove is undefined!\");\n }\n\n await approveTokenAsync({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spenderAddress, amountToApprove],\n });\n } catch (e: any) {\n console.error(\"Error approving token:\", e);\n throw e;\n }\n };\n\n return {\n isApproved,\n isApproving: isPending,\n justApproved,\n approveAsync,\n };\n};\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { Address, zeroAddress, erc20Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { queryConfig } from \"../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../utils/ensureClientAndConfig.js\";\n\nexport interface Token {\n symbol: string;\n decimals: number;\n name: string;\n}\n\nexport const EthTokenData: Token = {\n symbol: \"ETH\",\n decimals: 18,\n name: \"Ethereum\",\n};\n\nexport async function fetchDecimalsX(\n token: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<number | undefined> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n if (token === zeroAddress) return EthTokenData.decimals;\n\n const decimals = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: token,\n abi: erc20Abi,\n functionName: \"decimals\",\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return decimals;\n}\n\nexport async function fetchSymbolX(\n token: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<string> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n if (token === zeroAddress) return EthTokenData.symbol;\n\n const symbol = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: token,\n abi: erc20Abi,\n functionName: \"symbol\",\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return symbol;\n}\n\nexport async function fetchNameX(\n token: Address,\n queryClient: any,\n wagmiConfig: any\n): Promise<string> {\n if (token === zeroAddress) return EthTokenData.name;\n\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const name = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: token,\n abi: erc20Abi,\n functionName: \"name\",\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return name;\n}\n\n/**\n * Fetches the token metadata (symbol, decimals) for the given token address.\n * Internally calls:\n * - `fetchSymbol(token)` to retrieve the token symbol,\n * - `fetchDecimals(token)` to retrieve the token decimals\n * - `fetchName(token)` to retrieve the token name\n *\n * @param token - The address of the token.\n * @returns A `Token` object containing the symbol, decimals.\n * @throws Will throw an error if symbol or decimals cannot be fetched.\n */\nexport async function fetchTokenX(\n token: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<Token> {\n const [symbol, decimals, name] = await Promise.all([\n fetchSymbolX(token, queryClient, wagmiConfig),\n fetchDecimalsX(token, queryClient, wagmiConfig),\n fetchNameX(token, queryClient, wagmiConfig),\n ]);\n if (!symbol || !decimals || !name) {\n throw new Error(\"Failed to fetch token data\");\n }\n\n return {\n symbol,\n decimals,\n name,\n };\n}\n","import { useQueryClient, useQuery } from \"@tanstack/react-query\";\nimport { Address } from \"viem\";\nimport { useConfig } from \"wagmi\";\nimport { fetchTokenX } from \"../../fetch-functions/fetchTokenX.js\";\n\n/**\n * Returns a query key for fetching token data.\n *\n * @param {Address | undefined} asset - The token address.\n * @returns {Array} A unique query key for the token fetch.\n *\n * @example\n * const queryKey = HookFetchTokenQK(\"0x123...\");\n */\nexport const HookFetchTokenQK = (asset?: Address): any[] => [\n \"HookTokenWagmiExtended\",\n asset,\n];\n\n/**\n * Custom hook for fetching token metadata using extended Wagmi functionality.\n *\n * This hook leverages React Query for data fetching and caching.\n * It retrieves token metadata (such as symbol, decimals, name, etc.) for a given token address.\n *\n * @param {Address} [asset] - The token address.\n * @returns {Object} An object with the following properties:\n * - `data`: The token data (or undefined if not loaded).\n * - `isLoading`: Boolean indicating if the data is loading.\n * - `error`: Any error encountered during the fetch.\n * - `queryKey`: The unique key used for the query.\n *\n * @example\n * // In your component:\n * function MyTokenComponent() {\n * const { data, isLoading, error, queryKey } = useTokenX(\"0x123456...\");\n *\n * if (isLoading) return <div>Loading token data...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <p>Token Symbol: {data.symbol}</p>\n * <p>Decimals: {data.decimals}</p>\n * <p>Name: {data.name}</p>\n * </div>\n * );\n * }\n */\nexport const useTokenX = (asset?: Address) => {\n const queryClient = useQueryClient();\n const config = useConfig();\n\n const { data, ...rest } = useQuery({\n queryKey: HookFetchTokenQK(asset),\n queryFn: () => fetchTokenX(asset!, queryClient, config),\n enabled: Boolean(asset),\n });\n\n return {\n ...rest,\n data,\n queryKey: HookFetchTokenQK(asset),\n };\n};\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc20Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchBalanceOfX(\n asset: Address,\n user: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint | undefined> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n return await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: asset,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [user],\n }),\n ...queryConfig.lowSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc20Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchTotalSupplyX(\n asset: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint | undefined> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n return await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: asset,\n abi: erc20Abi,\n functionName: \"totalSupply\",\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\nimport { fetchAllowanceX } from \"./fetchAllowanceX.js\";\nimport { fetchBalanceOfX } from \"./fetchBalanceOfX.js\";\nimport { fetchTotalSupplyX } from \"./fetchTotalSupplyX.js\";\nimport { fetchNameX, fetchSymbolX, fetchDecimalsX } from \"../fetchTokenX.js\";\n\n/**\n * Fetches the full ERC-20 “summary” for a given vault and user context.\n */\nexport async function fetchERC20DataX(\n address: Address,\n user?: Address,\n spender?: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n) {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const [name, symbol, decimals, allowance, balanceOf, asset] =\n await Promise.all([\n fetchNameX(address, queryClient, wagmiConfig),\n fetchSymbolX(address, queryClient, wagmiConfig),\n fetchDecimalsX(address, queryClient, wagmiConfig),\n spender && user\n ? fetchAllowanceX(address, spender, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchBalanceOfX(address, user, queryClient, wagmiConfig)\n : undefined,\n fetchTotalSupplyX(address, queryClient, wagmiConfig),\n ]);\n\n return {\n name,\n symbol,\n decimals,\n allowance,\n balanceOf,\n asset,\n address,\n user,\n spender,\n };\n}\n\nexport type ERC20DataX = Awaited<ReturnType<typeof fetchERC20DataX>>;\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626AssetX(\n vault: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<Address> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"asset\",\n }),\n ...queryConfig.metaDataQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626TotalAssetsX(\n vault: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"totalAssets\",\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxDepositX(\n vault: Address,\n caller: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxDeposit\",\n args: [caller],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxMintX(\n vault: Address,\n caller: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxMint\",\n args: [caller],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxRedeemX(\n vault: Address,\n owner: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxRedeem\",\n args: [owner],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxWithdrawX(\n vault: Address,\n owner: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxWithdraw\",\n args: [owner],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\nimport { fetchERC4626AssetX } from \"./fetchERC4626AssetX.js\";\nimport { fetchERC4626MaxDepositX } from \"./fetchERC4626MaxDepositX.js\";\nimport { fetchERC4626TotalAssetsX } from \"./fetchERC4626TotalAssetsX.js\";\nimport { fetchERC4626MaxMintX } from \"./fetchERC4626MaxMintX.js\";\nimport { fetchERC4626MaxRedeemX } from \"./fetchERC4626MaxRedeemX.js\";\nimport { fetchERC4626MaxWithdrawX } from \"./fetchERC4626MaxWithdrawX.js\";\nimport { fetchERC20DataX } from \"../erc20/fetchERC20DataX.js\";\n\n/**\n * Fetches the full ERC-4626 “summary” for a given vault and user context.\n */\nexport async function fetchERC4626DataX(\n vault: Address,\n user?: Address,\n spender?: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n) {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const [erc20Data, maxDeposit, maxMint, maxRedeem, maxWithdraw] =\n await Promise.all([\n fetchERC20DataX(vault, user, spender, queryClient, wagmiConfig),\n\n fetchERC4626AssetX(vault, queryClient, wagmiConfig),\n fetchERC4626TotalAssetsX(vault, queryClient, wagmiConfig),\n user\n ? fetchERC4626MaxDepositX(vault, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchERC4626MaxMintX(vault, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchERC4626MaxRedeemX(vault, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchERC4626MaxWithdrawX(vault, user, queryClient, wagmiConfig)\n : undefined,\n ]);\n\n return {\n ...erc20Data,\n maxDeposit,\n maxMint,\n maxRedeem,\n maxWithdraw,\n vault,\n owner: user,\n spender,\n };\n}\n\nexport type ERC4626DataX = Awaited<ReturnType<typeof fetchERC4626DataX>>;\n"],"names":["useQueryClient","ContractFunctionRevertedError","useConfig","useState","waitForTransactionReceipt","usePublicClient","useWriteContract","useSendTransaction","readContractQueryOptions","erc20Abi","useAccount","useQuery","useEffect","maxUint256","zeroAddress","erc4626Abi"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/hooks/mutations/useInvalidateQueries.ts","../src/utils/errorParserX.ts","../src/hooks/mutations/useHandleTransactionMutationX.ts","../src/hooks/mutations/useContractWriteX.ts","../src/hooks/mutations/useSendTransactionX.ts","../src/query-config/index.ts","../src/config/defaults.ts","../src/utils/ensureClientAndConfig.ts","../src/fetch-functions/erc20/fetchAllowanceX.ts","../src/hooks/queries/useFetchAssetAllowanceX.ts","../src/hooks/mutations/useERC20ApproveX.ts","../src/fetch-functions/fetchTokenX.ts","../src/hooks/queries/useTokenX.ts","../src/fetch-functions/erc20/fetchBalanceOfX.ts","../src/fetch-functions/erc20/fetchTotalSupplyX.ts","../src/fetch-functions/erc20/fetchERC20DataX.ts","../src/fetch-functions/erc4626/fetchERC4626AssetX.ts","../src/fetch-functions/erc4626/fetchERC4626TotalAssetsX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxDepositX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxMintX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxRedeemX.ts","../src/fetch-functions/erc4626/fetchERC4626MaxWithdrawX.ts","../src/fetch-functions/erc4626/fetchERC4626DataX.ts","../src/fetch-functions/common/fetchDeploymentBlockX.ts"],"sourcesContent":["import { QueryKey, useQueryClient } from \"@tanstack/react-query\";\n\n/**\n * Hook to invalidate multiple queries in the React Query cache.\n *\n * @returns An object with the invalidateMany function.\n */\nexport function useInvalidateQueries() {\n const queryClient = useQueryClient();\n\n const invalidateMany = async (queries: (QueryKey | undefined)[]) => {\n const promises = queries.map((queryKey) =>\n queryClient.invalidateQueries({ queryKey })\n );\n await Promise.all(promises);\n };\n\n return { invalidateMany };\n}\n","import { BaseError, ContractFunctionRevertedError } from \"viem\";\n\n/**\n * Default error mapping that contains a set of error identifiers mapped to user-friendly error messages.\n */\nconst defaultErrorMapping: Record<string, string> = {\n EnforcedPause: \"Temporary pause in effect, please check Discord for updates.\",\n ErrorNotEnoughAllowance:\n \"Not enough allowance, did you approve your tokens first?\",\n \"0xc2139725\": \"Not enough allowance, did you approve your tokens first?\",\n SharesReceivedBelowMinimum:\n \"Action exceeded safe slippage parameters, please try again later\",\n \"0xea8d7f02\":\n \"Action exceeded safe slippage parameters, please try again later\",\n MaxSlippageExceeded:\n \"Action exceeded safe slippage parameters, please try again later\",\n \"51\": \"Supply cap exceeded\",\n};\n\n/**\n * A mutable copy of the default error mapping that can be extended or overridden by users.\n */\nlet currentErrorMapping: Record<string, string> = { ...defaultErrorMapping };\n\n/**\n * Merges a custom error mapping into the current error mapping.\n * Custom values override any existing keys.\n *\n * @param customMapping - An object containing error keys and the corresponding custom messages.\n *\n * @example\n * setErrorMapping({\n * ErrorNotEnoughAllowance: \"Custom message: Please approve tokens first!\",\n * NewCustomError: \"A custom error occurred.\"\n * });\n */\nexport const setErrorMapping = (\n customMapping: Record<string, string>\n): void => {\n currentErrorMapping = { ...currentErrorMapping, ...customMapping };\n};\n\n/**\n * Resets the current error mapping to the default error mapping.\n *\n * @example\n * resetErrorMapping();\n */\nexport const resetErrorMapping = (): void => {\n currentErrorMapping = {};\n};\n\n/**\n * Retrieves the current error mapping.\n *\n * @returns The current error mapping object.\n *\n * @example\n * const mapping = getErrorMapping();\n * console.log(mapping);\n */\nexport const getErrorMapping = (): Record<string, string> =>\n currentErrorMapping;\n\n/**\n * Parses an error object and returns a user-friendly error message.\n *\n * The function checks if the error is a ContractFunctionRevertedError by attempting to walk through\n * the error using its `walk` method. If a matching error is found and its error key exists in the\n * current error mapping, the corresponding custom message will be returned. Otherwise, it falls back\n * to the error's own message properties.\n *\n * @param error - The error object, potentially including additional error details.\n * @returns A user-friendly error message.\n *\n * @example\n * const message = getParsedError(someError);\n * console.log(message); // Outputs a custom error message or a default error message.\n */\nexport const getParsedErrorX = (error: any | BaseError): string => {\n const defaultMessage = \"An unknown error occurred. Please contact support.\";\n let message = defaultMessage;\n let errorKey = \"\";\n\n const revertedError = error?.walk\n ? error.walk((err: unknown) => err instanceof ContractFunctionRevertedError)\n : null;\n if (revertedError instanceof ContractFunctionRevertedError) {\n errorKey =\n revertedError.data?.errorName ??\n revertedError.signature ??\n revertedError.reason ??\n \"\";\n if (currentErrorMapping[errorKey]) return currentErrorMapping[errorKey];\n }\n\n message = error.shortMessage || error.details || error.message || message;\n return message;\n};\n","import { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { useConfig } from \"wagmi\";\nimport { Query, QueryKey } from \"@tanstack/query-core\";\nimport { Address } from \"viem\";\nimport { useState } from \"react\";\nimport { useInvalidateQueries } from \"./useInvalidateQueries.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { getParsedErrorX } from \"../../utils/errorParserX.js\";\n\nexport type WriteExtendedAsyncParams = {\n onSuccess?: (txHash: Address) => void;\n onError?: (e: any) => void;\n onSettled?: () => void;\n\n onSuccessAsync?: (txHash: Address) => Promise<void>;\n onErrorAsync?: (e: any) => Promise<void>;\n onSettledAsync?: () => Promise<void>;\n\n /** simple list of keys to invalidate */\n queriesToInvalidate?: (QueryKey | undefined)[];\n /** a predicate to decide which queries to invalidate */\n invalidatePredicate?: (query: Query<unknown, unknown>) => boolean;\n\n disableLogging?: boolean;\n disableWaitingForReceipt?: boolean;\n};\n\n/**\n * Custom hook to handle transaction mutations.\n *\n * @returns {Function} A shared `onSettled` callback for transaction mutations.\n */\nexport function useHandleTransactionMutationX({\n settings,\n}: {\n settings?: WriteExtendedAsyncParams;\n}) {\n const wagmiConfig = useConfig();\n const queryClient = useQueryClient();\n\n const { invalidateMany } = useInvalidateQueries();\n const [isPending, setIsPending] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string | undefined>(\n undefined\n );\n\n const onMutate = () => {\n setIsPending(true);\n setErrorMessage(undefined);\n };\n\n const onSettled = async (\n txHash: Address | undefined,\n error: any,\n args: any\n ) => {\n try {\n if (error) throw error;\n\n if (!settings?.disableWaitingForReceipt) {\n // 1. wait for transaction receipt\n const txReceipt = await waitForTransactionReceipt(wagmiConfig, {\n hash: txHash!,\n });\n\n // 2. throw if receipt is not valid\n if (txReceipt.status === \"reverted\")\n throw new Error(\"Execution reverted.\");\n if (txReceipt.status !== \"success\")\n throw new Error(\"Execution reverted.\");\n }\n\n // 3. invalidate queries\n const { queriesToInvalidate, invalidatePredicate } = settings || {};\n\n if (invalidatePredicate) {\n // 1) predicate-based\n await queryClient.invalidateQueries({\n predicate: invalidatePredicate,\n });\n }\n if (queriesToInvalidate) {\n // 2) explicit key list\n await invalidateMany(queriesToInvalidate);\n }\n\n // 4. call onSuccess callback\n settings?.onSuccess?.(txHash!);\n if (settings?.onSuccessAsync) await settings.onSuccessAsync(txHash!);\n\n if (!settings?.disableLogging) {\n // 5. log result\n // eslint-disable-next-line no-console\n console.info(\"Operation successful:\", txHash); // todo: add logging service\n }\n // 6. return result\n return txHash;\n } catch (error) {\n const parsedError = getParsedErrorX(error);\n\n if (!settings?.disableLogging) {\n // 1. log error\n console.error(\n `ContractWriteExtended Operation failed with error(parsed): ${parsedError}`,\n { error },\n { args }\n );\n console.error({ error });\n }\n // 2. set error message\n setErrorMessage(parsedError);\n\n // 3. call callback\n settings?.onError?.(error);\n if (settings?.onErrorAsync) await settings.onErrorAsync(error);\n } finally {\n setIsPending(false);\n // 1. call callback\n settings?.onSettled?.();\n if (settings?.onSettledAsync) await settings.onSettledAsync();\n }\n return undefined;\n };\n\n return {\n onMutate,\n onSettled,\n isPending,\n errorMessage,\n };\n}\n","import { usePublicClient, useSimulateContract, useWriteContract } from \"wagmi\";\nimport {\n WriteExtendedAsyncParams,\n useHandleTransactionMutationX,\n} from \"./useHandleTransactionMutationX.js\";\nimport { Address } from \"viem\";\n\n/**\n * Custom hook for writing to a smart contract using Wagmi with optional simulation.\n *\n * @param {WriteExtendedAsyncParams} settings - Settings for handling transaction lifecycle:\n * @param {boolean} [settings.disableWaitingForReceipt] - Disable waiting for receipt.\n * @param {boolean} [settings.disableLogging] - Disable logging.\n * @param {Function} [settings.onSuccess] - Callback invoked on successful transaction receipt.\n * @param {Function} [settings.onError] - Callback invoked on simulation or transaction error.\n * @param {Function} [settings.onSettled] - Callback invoked after transaction settles.\n * @param {Array<import('@tanstack/query-core').QueryKey>} [settings.queriesToInvalidate] - Query keys to invalidate after receipt.\n * @returns {Object} An object containing:\n * - writeContract: Wagmi's writeContract function.\n * - writeContractX: Wrapped writeContract with optional simulation.\n * - isPending: Boolean indicating if transaction is in progress.\n * - errorMessage: Error message if one occurred.\n *\n * @example\n * const { writeContractX, isPending, errorMessage } = useContractWriteX({ onSuccess: ..., onError: ... });\n * await writeContractX(\n * { abi, address, functionName, args, account, chain, value },\n * disable simulation? = false\n * );\n */\nexport function useContractWriteX(settings: WriteExtendedAsyncParams) {\n const publicClient = usePublicClient();\n\n const { isPending, errorMessage, onMutate, onSettled } =\n useHandleTransactionMutationX({ settings });\n\n // Underlying Wagmi write hook:\n const wagmiWrite = useWriteContract({\n mutation: { onMutate, onSettled },\n });\n\n async function writeContractX(\n params: Parameters<typeof wagmiWrite.writeContract>[0],\n disableSimulation = false\n ) {\n // 0) signal start\n onMutate();\n\n try {\n // 1) optional dry-run\n const { chain, ...others } = params;\n\n if (!disableSimulation) {\n await publicClient?.simulateContract({\n ...others,\n ...(chain != null ? { chain } : {}),\n });\n }\n\n wagmiWrite.writeContract(params);\n } catch (err) {\n await onSettled(undefined, err, params);\n }\n }\n\n return {\n ...wagmiWrite,\n writeContractX,\n isPending,\n errorMessage,\n };\n}\n","import { usePublicClient, useSendTransaction, useWriteContract } from \"wagmi\";\nimport {\n useHandleTransactionMutationX,\n WriteExtendedAsyncParams,\n} from \"./useHandleTransactionMutationX.js\";\nimport { writeContract } from \"wagmi/actions\";\n\n/**\n * Custom hook for sending a transaction using Wagmi with optional simulation.\n *\n * @param {WriteExtendedAsyncParams} [settings] - Settings for handling transaction lifecycle:\n * @param {boolean} [settings.disableWaitingForReceipt] - Disable waiting for receipt.\n * @param {boolean} [settings.disableLogging] - Disable logging.\n * @param {Function} [settings.onSuccess] - Callback on success.\n * @param {Function} [settings.onError] - Callback on error.\n * @param {Function} [settings.onSettled] - Callback after settlement.\n * @param {Array<import('@tanstack/query-core').QueryKey>} [settings.queriesToInvalidate] - Query keys to invalidate after receipt.\n * @returns {Object} An object containing:\n * - sendTransaction: Wagmi's sendTransaction function.\n * - sendTransactionX: Wrapped sendTransaction with optional simulation.\n * - isPending: Boolean indicating if transaction is in progress.\n * - errorMessage: Error message if one occurred.\n *\n * @example\n * const { sendTransactionX, isPending, errorMessage } = useSendTransactionX({ onSuccess: ..., onError: ... });\n * await sendTransactionX(\n * { to, value, data, account, chain },\n * { abi, functionName, args, chain }\n * );\n */\nexport function useSendTransactionX(settings?: WriteExtendedAsyncParams) {\n const publicClient = usePublicClient();\n\n const { isPending, errorMessage, onMutate, onSettled } =\n useHandleTransactionMutationX({\n settings,\n });\n\n const { sendTransaction, ...rest } = useSendTransaction({\n mutation: {\n onMutate,\n onSettled,\n },\n });\n\n /**\n * Wraps sendTransaction with an optional simulation step.\n *\n * @param {import('viem').SendTransactionParameters} params - Parameters to sendTransaction.\n * @param {import('viem').SimulateContractParameters} [simulationParams] - Optional parameters to simulate contract call:\n * @param {Array|object} simulationParams.abi - Contract ABI for simulation.\n * @param {string} simulationParams.functionName - Name of the contract function to simulate.\n * @param {any[]} [simulationParams.args] - Arguments for the function call.\n * @param {import('viem').Chain} [simulationParams.chain] - Chain to run the simulation on.\n * @returns {Promise<void>}\n */\n async function sendTransactionX(\n params: Parameters<typeof sendTransaction>[0],\n simulationParams?: Parameters<typeof writeContract>[1]\n ) {\n onMutate();\n\n try {\n if (params.to && simulationParams) {\n //simulate!\n await publicClient?.simulateContract({\n address: params.to,\n abi: simulationParams.abi,\n functionName: simulationParams.functionName,\n args: simulationParams.args ?? [],\n account: params.account,\n ...(simulationParams.chain != null\n ? { chain: simulationParams.chain }\n : {}),\n });\n }\n // actual send!\n await sendTransaction(params);\n } catch (err) {\n await onSettled(undefined, err, params);\n }\n }\n\n return {\n ...rest,\n isPending,\n errorMessage,\n sendTransaction,\n sendTransactionX,\n };\n}\n","export enum QueryType {\n MetaDataQuery = \"metaDataQuery\",\n SemiSensitiveQuery = \"semiSensitiveQuery\",\n LowSensitiveQuery = \"lowSensitiveQuery\",\n ExpensiveQuery = \"expensiveQuery\",\n PriceQuery = \"priceQuery\",\n}\n\nexport const queryConfig = {\n metaDataQuery: {\n staleTime: Number.POSITIVE_INFINITY,\n meta: { queryType: QueryType.MetaDataQuery } as const,\n },\n lowSensitiveQuery: {\n staleTime: 60_000,\n meta: { queryType: QueryType.SemiSensitiveQuery } as const,\n },\n semiSensitiveQuery: {\n staleTime: 180_000,\n meta: { queryType: QueryType.LowSensitiveQuery } as const,\n },\n priceQuery: {\n staleTime: 30 * 60 * 1000,\n meta: { queryType: QueryType.PriceQuery } as const,\n },\n expensiveQuery: {\n staleTime: 60 * 60 * 1000,\n meta: { queryType: QueryType.ExpensiveQuery } as const,\n },\n};\n","// src/config/defaults.ts\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { Config } from \"wagmi\";\n\n// You can adjust the type for wagmiConfig to match your needs.\nlet defaultQueryClient: QueryClient | null = null;\nlet defaultWagmiConfig: any = null;\n\n/**\n * Sets the default configuration values.\n *\n * @param queryClient - The default QueryClient instance.\n * @param wagmiConfig - The default Wagmi configuration.\n * @example\n * //In your application initialization (e.g., index.tsx or App.tsx):\n * import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n * import { wagmiConfig } from \"/path/to/wagmi-config\";\n * import { setDefaults } from \"wagmi-extended\";\n *\n * const queryClient = new QueryClient();\n *\n * //Set defaults for the extended library functions.\n * setDefaults(queryClient, wagmiConfig);\n *\n * //Now helper functions like fetchTokenX can use these defaults if no explicit parameters are provided.\n */\nexport function setDefaults(\n queryClient: QueryClient,\n wagmiConfig: Config\n): void {\n defaultQueryClient = queryClient;\n defaultWagmiConfig = wagmiConfig;\n}\n\n/**\n * Retrieves the currently set default configurations.\n *\n * @throws Will throw an error if defaults are not initialized.\n * @returns An object containing the default queryClient and wagmiConfig.\n *\n * @example\n * // Usage in a helper function:\n * import { getDefaults } from \"wagmi-extended\";\n *\n * function exampleFunction() {\n * const { queryClient, wagmiConfig } = getDefaults();\n * // Use queryClient and wagmiConfig as needed...\n * }\n */\nexport function getDefaults(): {\n queryClient: QueryClient;\n wagmiConfig: Config;\n} {\n if (!defaultQueryClient || !defaultWagmiConfig) {\n throw new Error(\n \"Default configuration not set. Please call setDefaults() first.\"\n );\n }\n return { queryClient: defaultQueryClient, wagmiConfig: defaultWagmiConfig };\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Config } from \"wagmi\";\nimport { getDefaults } from \"../config/defaults.js\";\n\nexport function ensureClientAndConfig(\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): { queryClient: QueryClient; wagmiConfig: Config } {\n if (!queryClient || !wagmiConfig) {\n ({ queryClient, wagmiConfig } = getDefaults());\n }\n if (!queryClient || !wagmiConfig) {\n throw new Error(\n \"Could not find queryClient or wagmiConfig; pass them in or setDefaults() first\"\n );\n }\n return { queryClient, wagmiConfig };\n}\n","import { Address, erc20Abi } from \"viem\";\nimport type { Config } from \"wagmi\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchAllowanceX(\n asset: Address,\n spender: Address,\n user: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n) {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const allowance = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: asset,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [user, spender],\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return allowance;\n}\n","import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Address, erc20Abi } from \"viem\";\nimport { useAccount, useConfig } from \"wagmi\";\nimport { fetchAllowanceX } from \"../../fetch-functions/erc20/fetchAllowanceX.js\";\nimport { queryConfig } from \"../../query-config/index.js\";\n\nexport const HookFetchAssetAllowanceQK = (\n asset?: Address,\n spender?: Address,\n userAddress?: Address\n) => [\"HookFetchAllowance\", asset, spender, userAddress] as const;\n\n/**\n * Custom hook for fetching asset allowance.\n *\n * @param {Address} asset - The address of the ERC20 token contract.\n * @param {Address} spender - The address of the spender to check allowance for.\n *\n *\n * @example\n * // In your component:\n * function AllowanceDisplay() {\n * const { data: allowance, isLoading, error } = useFetchAssetAllowanceX({\n * asset: \"0xTokenAddressExample\",\n * spender: \"0xSpenderAddressExample\",\n * });\n *\n * if (isLoading) return <div>Loading allowance...</div>;\n * if (error) return <div>Error loading allowance</div>;\n *\n * return (\n * <div>\n * Current Allowance: {allowance}\n * </div>\n * );\n * }\n */\nexport const useFetchAssetAllowanceX = ({\n asset,\n spender,\n}: {\n asset?: Address;\n spender?: Address;\n}) => {\n const config = useConfig();\n const queryClient = useQueryClient();\n const { address: userAddress } = useAccount();\n\n const { data, ...rest } = useQuery({\n queryKey: HookFetchAssetAllowanceQK(asset, spender, userAddress),\n queryFn: () =>\n fetchAllowanceX(asset!, spender!, userAddress!, queryClient, config),\n enabled: Boolean(asset) && Boolean(spender) && Boolean(userAddress),\n ...queryConfig.lowSensitiveQuery,\n });\n\n return {\n ...rest,\n data,\n queryKey: HookFetchAssetAllowanceQK(asset, spender, userAddress),\n };\n};\n","import { useState, useEffect } from \"react\";\nimport { Address, maxUint256, erc20Abi } from \"viem\";\nimport { useFetchAssetAllowanceX } from \"../queries/useFetchAssetAllowanceX.js\";\nimport { useContractWriteX } from \"./useContractWriteX.js\";\n\n/**\n * Custom hook for approving ERC20 token transfers.\n *\n * This hook provides functionality for approving ERC20 token transfers, checking the current allowance, and handling the approval transaction using Wagmi.\n *\n * @param {Address} tokenAddress - The address of the ERC20 token contract (the transfer from).\n * @param {Address} spenderAddress - The address of the spender to approve the transfer to.\n * @param {bigint} [amount=BigInt(0)] - The amount to approve for transfer. Defaults to undefined.\n * @param {boolean} [approveMax=false] - Indicates whether to approve the maximum amount or a specific amount.\n * @returns {Object} Object containing the following properties:\n * - {boolean} isApproved - Indicates whether the spender is already approved to transfer the specified amount of tokens.\n * - {boolean} isApproving - Indicates whether an approval transaction is currently pending.\n * - {Function} approveAsync - Function to trigger the approval transaction.\n *\n * @example\n * // In your component:\n * function ApproveTokenButton(amountToApprove) {\n * const tokenAddress = \"0xTokenAddressExample\";\n * const spenderAddress = \"0xSpenderAddressExample\";\n *\n * const { isApproved, isApproving, justApproved, approveAsync } = useERC20ApproveX(\n * tokenAddress,\n * spenderAddress,\n * parseUnits(amountToApprove.toString(), 18),\n * );\n *\n * return (\n * <button onClick={approveAsync} disabled={isApproving || isApproved}>\n * {isApproving ? \"Approving...\" : isApproved ? \"Approved\" : \"Approve Token\"}\n * </button>\n * );\n * }\n */\n\nexport const useERC20ApproveX = (\n tokenAddress?: Address,\n spenderAddress?: Address,\n amount?: bigint,\n approveMax?: boolean\n) => {\n const [isApproved, setIsApproved] = useState(false);\n const [justApproved, setJustApproved] = useState(false);\n\n const { data: allowance, queryKey: allowanceKQ } = useFetchAssetAllowanceX({\n asset: tokenAddress,\n spender: spenderAddress,\n });\n\n const { writeContractAsync: approveTokenAsync, isPending } =\n useContractWriteX({\n queriesToInvalidate: [allowanceKQ],\n onSuccess: () => {\n setJustApproved(true);\n },\n });\n\n useEffect(() => {\n if (amount == null) {\n setIsApproved(false);\n } else if (allowance && allowance >= amount) {\n setIsApproved(true);\n } else {\n setIsApproved(false);\n }\n }, [allowance, amount]);\n\n const approveAsync = async () => {\n const amountToApprove = approveMax ? maxUint256 : amount;\n\n try {\n if (!spenderAddress) {\n throw new Error(\"spenderAddress is undefined!\");\n }\n if (!tokenAddress) {\n throw new Error(\"tokenAddress is undefined!\");\n }\n if (amountToApprove == null) {\n throw new Error(\"amountToApprove is undefined!\");\n }\n\n await approveTokenAsync({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spenderAddress, amountToApprove],\n });\n } catch (e: any) {\n console.error(\"Error approving token:\", e);\n throw e;\n }\n };\n\n return {\n isApproved,\n isApproving: isPending,\n justApproved,\n approveAsync,\n };\n};\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { Address, zeroAddress, erc20Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { queryConfig } from \"../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../utils/ensureClientAndConfig.js\";\n\nexport interface Token {\n symbol: string;\n decimals: number;\n name: string;\n}\n\nexport const EthTokenData: Token = {\n symbol: \"ETH\",\n decimals: 18,\n name: \"Ethereum\",\n};\n\nexport async function fetchDecimalsX(\n token: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<number | undefined> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n if (token === zeroAddress) return EthTokenData.decimals;\n\n const decimals = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: token,\n abi: erc20Abi,\n functionName: \"decimals\",\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return decimals;\n}\n\nexport async function fetchSymbolX(\n token: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<string> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n if (token === zeroAddress) return EthTokenData.symbol;\n\n const symbol = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: token,\n abi: erc20Abi,\n functionName: \"symbol\",\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return symbol;\n}\n\nexport async function fetchNameX(\n token: Address,\n queryClient: any,\n wagmiConfig: any\n): Promise<string> {\n if (token === zeroAddress) return EthTokenData.name;\n\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const name = await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: token,\n abi: erc20Abi,\n functionName: \"name\",\n }),\n ...queryConfig.metaDataQuery,\n });\n\n return name;\n}\n\n/**\n * Fetches the token metadata (symbol, decimals) for the given token address.\n * Internally calls:\n * - `fetchSymbol(token)` to retrieve the token symbol,\n * - `fetchDecimals(token)` to retrieve the token decimals\n * - `fetchName(token)` to retrieve the token name\n *\n * @param token - The address of the token.\n * @returns A `Token` object containing the symbol, decimals.\n * @throws Will throw an error if symbol or decimals cannot be fetched.\n */\nexport async function fetchTokenX(\n token: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<Token> {\n const [symbol, decimals, name] = await Promise.all([\n fetchSymbolX(token, queryClient, wagmiConfig),\n fetchDecimalsX(token, queryClient, wagmiConfig),\n fetchNameX(token, queryClient, wagmiConfig),\n ]);\n if (!symbol || !decimals || !name) {\n throw new Error(\"Failed to fetch token data\");\n }\n\n return {\n symbol,\n decimals,\n name,\n };\n}\n","import { useQueryClient, useQuery } from \"@tanstack/react-query\";\nimport { Address } from \"viem\";\nimport { useConfig } from \"wagmi\";\nimport { fetchTokenX } from \"../../fetch-functions/fetchTokenX.js\";\n\n/**\n * Returns a query key for fetching token data.\n *\n * @param {Address | undefined} asset - The token address.\n * @returns {Array} A unique query key for the token fetch.\n *\n * @example\n * const queryKey = HookFetchTokenQK(\"0x123...\");\n */\nexport const HookFetchTokenQK = (asset?: Address): any[] => [\n \"HookTokenWagmiExtended\",\n asset,\n];\n\n/**\n * Custom hook for fetching token metadata using extended Wagmi functionality.\n *\n * This hook leverages React Query for data fetching and caching.\n * It retrieves token metadata (such as symbol, decimals, name, etc.) for a given token address.\n *\n * @param {Address} [asset] - The token address.\n * @returns {Object} An object with the following properties:\n * - `data`: The token data (or undefined if not loaded).\n * - `isLoading`: Boolean indicating if the data is loading.\n * - `error`: Any error encountered during the fetch.\n * - `queryKey`: The unique key used for the query.\n *\n * @example\n * // In your component:\n * function MyTokenComponent() {\n * const { data, isLoading, error, queryKey } = useTokenX(\"0x123456...\");\n *\n * if (isLoading) return <div>Loading token data...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <p>Token Symbol: {data.symbol}</p>\n * <p>Decimals: {data.decimals}</p>\n * <p>Name: {data.name}</p>\n * </div>\n * );\n * }\n */\nexport const useTokenX = (asset?: Address) => {\n const queryClient = useQueryClient();\n const config = useConfig();\n\n const { data, ...rest } = useQuery({\n queryKey: HookFetchTokenQK(asset),\n queryFn: () => fetchTokenX(asset!, queryClient, config),\n enabled: Boolean(asset),\n });\n\n return {\n ...rest,\n data,\n queryKey: HookFetchTokenQK(asset),\n };\n};\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc20Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchBalanceOfX(\n asset: Address,\n user: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint | undefined> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n return await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: asset,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [user],\n }),\n ...queryConfig.lowSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc20Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchTotalSupplyX(\n asset: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint | undefined> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n return await queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: asset,\n abi: erc20Abi,\n functionName: \"totalSupply\",\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\nimport { fetchAllowanceX } from \"./fetchAllowanceX.js\";\nimport { fetchBalanceOfX } from \"./fetchBalanceOfX.js\";\nimport { fetchTotalSupplyX } from \"./fetchTotalSupplyX.js\";\nimport { fetchNameX, fetchSymbolX, fetchDecimalsX } from \"../fetchTokenX.js\";\n\n/**\n * Fetches the full ERC-20 “summary” for a given vault and user context.\n */\nexport async function fetchERC20DataX(\n address: Address,\n user?: Address,\n spender?: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n) {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const [name, symbol, decimals, allowance, balanceOf, asset] =\n await Promise.all([\n fetchNameX(address, queryClient, wagmiConfig),\n fetchSymbolX(address, queryClient, wagmiConfig),\n fetchDecimalsX(address, queryClient, wagmiConfig),\n spender && user\n ? fetchAllowanceX(address, spender, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchBalanceOfX(address, user, queryClient, wagmiConfig)\n : undefined,\n fetchTotalSupplyX(address, queryClient, wagmiConfig),\n ]);\n\n return {\n name,\n symbol,\n decimals,\n allowance,\n balanceOf,\n asset,\n address,\n user,\n spender,\n };\n}\n\nexport type ERC20DataX = Awaited<ReturnType<typeof fetchERC20DataX>>;\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626AssetX(\n vault: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<Address> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"asset\",\n }),\n ...queryConfig.metaDataQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626TotalAssetsX(\n vault: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"totalAssets\",\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxDepositX(\n vault: Address,\n caller: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxDeposit\",\n args: [caller],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxMintX(\n vault: Address,\n caller: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxMint\",\n args: [caller],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxRedeemX(\n vault: Address,\n owner: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxRedeem\",\n args: [owner],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address, erc4626Abi } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { readContractQueryOptions } from \"wagmi/query\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\nexport async function fetchERC4626MaxWithdrawX(\n vault: Address,\n owner: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n return queryClient.fetchQuery({\n ...readContractQueryOptions(wagmiConfig, {\n address: vault,\n abi: erc4626Abi,\n functionName: \"maxWithdraw\",\n args: [owner],\n }),\n ...queryConfig.semiSensitiveQuery,\n });\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport { Address } from \"viem\";\nimport { Config } from \"wagmi\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\nimport { fetchERC4626AssetX } from \"./fetchERC4626AssetX.js\";\nimport { fetchERC4626MaxDepositX } from \"./fetchERC4626MaxDepositX.js\";\nimport { fetchERC4626TotalAssetsX } from \"./fetchERC4626TotalAssetsX.js\";\nimport { fetchERC4626MaxMintX } from \"./fetchERC4626MaxMintX.js\";\nimport { fetchERC4626MaxRedeemX } from \"./fetchERC4626MaxRedeemX.js\";\nimport { fetchERC4626MaxWithdrawX } from \"./fetchERC4626MaxWithdrawX.js\";\nimport { fetchERC20DataX } from \"../erc20/fetchERC20DataX.js\";\n\n/**\n * Fetches the full ERC-4626 “summary” for a given vault and user context.\n */\nexport async function fetchERC4626DataX(\n vault: Address,\n user?: Address,\n spender?: Address,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n) {\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n const [erc20Data, maxDeposit, maxMint, maxRedeem, maxWithdraw] =\n await Promise.all([\n fetchERC20DataX(vault, user, spender, queryClient, wagmiConfig),\n\n fetchERC4626AssetX(vault, queryClient, wagmiConfig),\n fetchERC4626TotalAssetsX(vault, queryClient, wagmiConfig),\n user\n ? fetchERC4626MaxDepositX(vault, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchERC4626MaxMintX(vault, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchERC4626MaxRedeemX(vault, user, queryClient, wagmiConfig)\n : undefined,\n user\n ? fetchERC4626MaxWithdrawX(vault, user, queryClient, wagmiConfig)\n : undefined,\n ]);\n\n return {\n ...erc20Data,\n maxDeposit,\n maxMint,\n maxRedeem,\n maxWithdraw,\n vault,\n owner: user,\n spender,\n };\n}\n\nexport type ERC4626DataX = Awaited<ReturnType<typeof fetchERC4626DataX>>;\n","import type { Address, Hex } from \"viem\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport type { Config } from \"wagmi\";\nimport { getPublicClient } from \"wagmi/actions\";\nimport { queryConfig } from \"../../query-config/index.js\";\nimport { ensureClientAndConfig } from \"../../utils/ensureClientAndConfig.js\";\n\n/** Reusable React Query key helper for deployment block lookups. */\nexport const deploymentBlockKey = (\n chainId: number | undefined,\n address: Address | undefined,\n floor: bigint\n) => [\"deploymentBlock\", chainId, address?.toLowerCase(), floor] as const;\n\n/**\n * Internal helper: checks if there is bytecode at `address` on `blockNumber`.\n */\nasync function hasCodeAtX(\n address: Address,\n blockNumber: bigint,\n wagmiConfig: Config\n): Promise<boolean> {\n const client = getPublicClient(wagmiConfig);\n if (!client) throw new Error(\"Public client is missing\");\n const code: Hex | undefined = await client.getCode({ address, blockNumber });\n return !!code && code !== \"0x\";\n}\n\n/**\n * Internal helper: finds the earliest block where code exists at `address`,\n * using exponential descent to find a lower bound and then binary search.\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive) to start from. If you know\n * the contract cannot exist below this block, pass it to\n * speed up the search. Defaults to `0n`.\n * @returns The first block number (bigint) where code is present.\n * @throws If no code exists at the latest block (i.e., contract not deployed).\n */\nasync function findDeploymentBlockRpcX(\n address: Address,\n wagmiConfig: Config,\n floor: bigint = 0n\n): Promise<bigint> {\n const client = getPublicClient(wagmiConfig);\n if (!client) throw new Error(\"Public client is missing\");\n\n const latest = await client.getBlockNumber();\n if (!(await hasCodeAtX(address, latest, wagmiConfig))) {\n const chainId = client.chain?.id ?? 0;\n throw new Error(\n `No code for ${address} at latest block ${latest} on chain ${chainId}.`\n );\n }\n\n // If caller-supplied floor already has code, it *is* the first code block.\n if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))\n return floor;\n\n // Exponential descent to find a \"no code\" lower bound fast.\n let lo = floor; // known (or assumed) no code\n let hi = latest; // known has code\n let step = 1n;\n\n while (hi - step > lo) {\n const probe = hi - step;\n if (await hasCodeAtX(address, probe, wagmiConfig)) {\n hi = probe; // still has code -> move upper bound down\n step <<= 1n; // double the step\n } else {\n lo = probe; // found a no-code block\n break;\n }\n }\n\n // Binary search to the first block with code in (lo, hi]\n while (lo + 1n < hi) {\n const mid = lo + (hi - lo) / 2n;\n if (await hasCodeAtX(address, mid, wagmiConfig)) hi = mid;\n else lo = mid;\n }\n return hi;\n}\n\n/**\n * Builds React Query options for caching the deployment block \"forever\".\n *\n * Use with `queryClient.fetchQuery(...)`.\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive) to speed up search. Defaults to `0n`.\n * @param wagmiConfig - Wagmi `Config` (optional; resolved via `ensureClientAndConfig` if omitted).\n *\n * @returns A fully-configured query options object (key + fn + metadata).\n */\nexport function getDeploymentBlockQueryOptionsX(\n address: Address,\n floor: bigint = 0n,\n wagmiConfig?: Config\n) {\n if (!address) throw new Error(\"Address is required\");\n\n // Resolve config (caller may pass undefined; we'll normalize later in fetcher too)\n // We only need chainId for the key; if wagmiConfig is missing here,\n // we allow it since fetcher re-resolves. But key stability benefits from chainId.\n const client = wagmiConfig ? getPublicClient(wagmiConfig) : undefined;\n const chainId = client?.chain?.id;\n\n return {\n queryKey: deploymentBlockKey(chainId, address, floor),\n queryFn: async () => {\n if (!wagmiConfig)\n throw new Error(\"wagmiConfig is required at execution time\");\n return findDeploymentBlockRpcX(address, wagmiConfig, floor);\n },\n ...queryConfig.metaDataQuery,\n } as const;\n}\n\n/**\n * Fetches (and caches) the first block where contract bytecode exists at `address`.\n *\n * Uses your shared `QueryClient` and Wagmi `Config` like other `fetch*X` helpers.\n * Internally, this runs an **exponential descent** to find a safe lower bound,\n * followed by an **optimal binary search** to pinpoint the exact deployment block.\n *\n * #### Caching\n * - Query key: `[\"deploymentBlock\", chainId, address.toLowerCase(), floor]`\n * - For long-lived results, we apply `queryConfig.metaDataQuery` (tweak as needed).\n *\n * #### Performance\n * - **O(log N)** `eth_getCode` calls, where `N` is the gap between the latest\n * block and the deployment block—optimal among comparison-based strategies.\n *\n * @example\n * ```ts\n * const block = await fetchDeploymentBlockX(\"0xContract...\", 0n, queryClient, wagmiConfig);\n * ```\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive) to speed up search. Defaults to `0n`.\n * @param queryClient - Optional TanStack `QueryClient`. If omitted, resolved by `ensureClientAndConfig`.\n * @param wagmiConfig - Optional Wagmi `Config`. If omitted, resolved by `ensureClientAndConfig`.\n *\n * @returns The earliest block number (bigint) where bytecode exists.\n *\n * @throws If the public client is missing or if no code is present at the latest block.\n */\nexport async function fetchDeploymentBlockX(\n address: Address,\n floor: bigint = 0n,\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n if (!address) throw new Error(\"Address is required\");\n\n ({ queryClient, wagmiConfig } = ensureClientAndConfig(\n queryClient,\n wagmiConfig\n ));\n\n // Resolve chainId for a stable cache key\n const client = getPublicClient(wagmiConfig);\n const chainId = client?.chain?.id;\n if (!chainId) throw new Error(\"Client chain ID is missing\");\n\n return queryClient.fetchQuery({\n ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig),\n // Ensure the final key includes a concrete chainId\n queryKey: deploymentBlockKey(chainId, address, floor),\n // Reinstate metadata (in case your ensure/util merges)\n ...queryConfig.metaDataQuery,\n });\n}\n"],"names":["useQueryClient","ContractFunctionRevertedError","useConfig","useState","waitForTransactionReceipt","usePublicClient","useWriteContract","useSendTransaction","QueryType","readContractQueryOptions","erc20Abi","useAccount","useQuery","useEffect","maxUint256","zeroAddress","erc4626Abi","getPublicClient"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,5 +16,7 @@ export * from "./fetch-functions/erc4626/fetchERC4626MaxMintX.js";
16
16
  export * from "./fetch-functions/erc4626/fetchERC4626MaxRedeemX.js";
17
17
  export * from "./fetch-functions/erc4626/fetchERC4626MaxWithdrawX.js";
18
18
  export * from "./fetch-functions/erc4626/fetchERC4626DataX.js";
19
+ export * from "./fetch-functions/common/fetchDeploymentBlockX.js";
19
20
  export * from "./utils/errorParserX.js";
20
21
  export * from "./config/defaults.js";
22
+ export * from "./query-config/index.js";
package/dist/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useConfig, usePublicClient, useWriteContract, useSendTransaction, useAccount } from 'wagmi';
2
- import { waitForTransactionReceipt } from 'wagmi/actions';
2
+ import { waitForTransactionReceipt, getPublicClient } from 'wagmi/actions';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { useQueryClient, useQuery } from '@tanstack/react-query';
5
5
  import { ContractFunctionRevertedError, erc20Abi, maxUint256, zeroAddress, erc4626Abi } from 'viem';
@@ -85,16 +85,18 @@ const getErrorMapping = () => currentErrorMapping;
85
85
  * console.log(message); // Outputs a custom error message or a default error message.
86
86
  */
87
87
  const getParsedErrorX = (error) => {
88
- var _a, _b, _c, _d;
89
88
  const defaultMessage = "An unknown error occurred. Please contact support.";
90
89
  let message = defaultMessage;
91
90
  let errorKey = "";
92
- const revertedError = (error === null || error === void 0 ? void 0 : error.walk)
91
+ const revertedError = error?.walk
93
92
  ? error.walk((err) => err instanceof ContractFunctionRevertedError)
94
93
  : null;
95
94
  if (revertedError instanceof ContractFunctionRevertedError) {
96
95
  errorKey =
97
- (_d = (_c = (_b = (_a = revertedError.data) === null || _a === void 0 ? void 0 : _a.errorName) !== null && _b !== void 0 ? _b : revertedError.signature) !== null && _c !== void 0 ? _c : revertedError.reason) !== null && _d !== void 0 ? _d : "";
96
+ revertedError.data?.errorName ??
97
+ revertedError.signature ??
98
+ revertedError.reason ??
99
+ "";
98
100
  if (currentErrorMapping[errorKey])
99
101
  return currentErrorMapping[errorKey];
100
102
  }
@@ -118,11 +120,10 @@ function useHandleTransactionMutationX({ settings, }) {
118
120
  setErrorMessage(undefined);
119
121
  };
120
122
  const onSettled = async (txHash, error, args) => {
121
- var _a, _b, _c;
122
123
  try {
123
124
  if (error)
124
125
  throw error;
125
- if (!(settings === null || settings === void 0 ? void 0 : settings.disableWaitingForReceipt)) {
126
+ if (!settings?.disableWaitingForReceipt) {
126
127
  // 1. wait for transaction receipt
127
128
  const txReceipt = await waitForTransactionReceipt(wagmiConfig, {
128
129
  hash: txHash,
@@ -146,10 +147,10 @@ function useHandleTransactionMutationX({ settings, }) {
146
147
  await invalidateMany(queriesToInvalidate);
147
148
  }
148
149
  // 4. call onSuccess callback
149
- (_a = settings === null || settings === void 0 ? void 0 : settings.onSuccess) === null || _a === void 0 ? void 0 : _a.call(settings, txHash);
150
- if (settings === null || settings === void 0 ? void 0 : settings.onSuccessAsync)
150
+ settings?.onSuccess?.(txHash);
151
+ if (settings?.onSuccessAsync)
151
152
  await settings.onSuccessAsync(txHash);
152
- if (!(settings === null || settings === void 0 ? void 0 : settings.disableLogging)) {
153
+ if (!settings?.disableLogging) {
153
154
  // 5. log result
154
155
  // eslint-disable-next-line no-console
155
156
  console.info("Operation successful:", txHash); // todo: add logging service
@@ -159,7 +160,7 @@ function useHandleTransactionMutationX({ settings, }) {
159
160
  }
160
161
  catch (error) {
161
162
  const parsedError = getParsedErrorX(error);
162
- if (!(settings === null || settings === void 0 ? void 0 : settings.disableLogging)) {
163
+ if (!settings?.disableLogging) {
163
164
  // 1. log error
164
165
  console.error(`ContractWriteExtended Operation failed with error(parsed): ${parsedError}`, { error }, { args });
165
166
  console.error({ error });
@@ -167,15 +168,15 @@ function useHandleTransactionMutationX({ settings, }) {
167
168
  // 2. set error message
168
169
  setErrorMessage(parsedError);
169
170
  // 3. call callback
170
- (_b = settings === null || settings === void 0 ? void 0 : settings.onError) === null || _b === void 0 ? void 0 : _b.call(settings, error);
171
- if (settings === null || settings === void 0 ? void 0 : settings.onErrorAsync)
171
+ settings?.onError?.(error);
172
+ if (settings?.onErrorAsync)
172
173
  await settings.onErrorAsync(error);
173
174
  }
174
175
  finally {
175
176
  setIsPending(false);
176
177
  // 1. call callback
177
- (_c = settings === null || settings === void 0 ? void 0 : settings.onSettled) === null || _c === void 0 ? void 0 : _c.call(settings);
178
- if (settings === null || settings === void 0 ? void 0 : settings.onSettledAsync)
178
+ settings?.onSettled?.();
179
+ if (settings?.onSettledAsync)
179
180
  await settings.onSettledAsync();
180
181
  }
181
182
  return undefined;
@@ -225,10 +226,10 @@ function useContractWriteX(settings) {
225
226
  // 1) optional dry-run
226
227
  const { chain, ...others } = params;
227
228
  if (!disableSimulation) {
228
- await (publicClient === null || publicClient === void 0 ? void 0 : publicClient.simulateContract({
229
+ await publicClient?.simulateContract({
229
230
  ...others,
230
231
  ...(chain != null ? { chain } : {}),
231
- }));
232
+ });
232
233
  }
233
234
  wagmiWrite.writeContract(params);
234
235
  }
@@ -290,21 +291,20 @@ function useSendTransactionX(settings) {
290
291
  * @returns {Promise<void>}
291
292
  */
292
293
  async function sendTransactionX(params, simulationParams) {
293
- var _a;
294
294
  onMutate();
295
295
  try {
296
296
  if (params.to && simulationParams) {
297
297
  //simulate!
298
- await (publicClient === null || publicClient === void 0 ? void 0 : publicClient.simulateContract({
298
+ await publicClient?.simulateContract({
299
299
  address: params.to,
300
300
  abi: simulationParams.abi,
301
301
  functionName: simulationParams.functionName,
302
- args: (_a = simulationParams.args) !== null && _a !== void 0 ? _a : [],
302
+ args: simulationParams.args ?? [],
303
303
  account: params.account,
304
304
  ...(simulationParams.chain != null
305
305
  ? { chain: simulationParams.chain }
306
306
  : {}),
307
- }));
307
+ });
308
308
  }
309
309
  // actual send!
310
310
  await sendTransaction(params);
@@ -322,19 +322,36 @@ function useSendTransactionX(settings) {
322
322
  };
323
323
  }
324
324
 
325
+ var QueryType;
326
+ (function (QueryType) {
327
+ QueryType["MetaDataQuery"] = "metaDataQuery";
328
+ QueryType["SemiSensitiveQuery"] = "semiSensitiveQuery";
329
+ QueryType["LowSensitiveQuery"] = "lowSensitiveQuery";
330
+ QueryType["ExpensiveQuery"] = "expensiveQuery";
331
+ QueryType["PriceQuery"] = "priceQuery";
332
+ })(QueryType || (QueryType = {}));
325
333
  const queryConfig = {
326
334
  metaDataQuery: {
327
335
  staleTime: Number.POSITIVE_INFINITY,
328
- meta: { category: "metadata" },
336
+ meta: { queryType: QueryType.MetaDataQuery },
329
337
  },
330
338
  lowSensitiveQuery: {
331
339
  staleTime: 60000,
332
- meta: { category: "lowSensitive" },
340
+ meta: { queryType: QueryType.SemiSensitiveQuery },
333
341
  },
334
342
  semiSensitiveQuery: {
335
343
  staleTime: 180000,
336
- meta: { category: "semiSensitive" },
337
- }};
344
+ meta: { queryType: QueryType.LowSensitiveQuery },
345
+ },
346
+ priceQuery: {
347
+ staleTime: 30 * 60 * 1000,
348
+ meta: { queryType: QueryType.PriceQuery },
349
+ },
350
+ expensiveQuery: {
351
+ staleTime: 60 * 60 * 1000,
352
+ meta: { queryType: QueryType.ExpensiveQuery },
353
+ },
354
+ };
338
355
 
339
356
  // You can adjust the type for wagmiConfig to match your needs.
340
357
  let defaultQueryClient = null;
@@ -836,5 +853,141 @@ async function fetchERC4626DataX(vault, user, spender, queryClient, wagmiConfig)
836
853
  };
837
854
  }
838
855
 
839
- export { EthTokenData, HookFetchTokenQK, fetchAllowanceX, fetchBalanceOfX, fetchDecimalsX, fetchERC20DataX, fetchERC4626AssetX, fetchERC4626DataX, fetchERC4626MaxDepositX, fetchERC4626MaxMintX, fetchERC4626MaxRedeemX, fetchERC4626MaxWithdrawX, fetchERC4626TotalAssetsX, fetchNameX, fetchSymbolX, fetchTokenX, fetchTotalSupplyX, getDefaults, getErrorMapping, getParsedErrorX, resetErrorMapping, setDefaults, setErrorMapping, useContractWriteX, useERC20ApproveX, useFetchAssetAllowanceX, useHandleTransactionMutationX, useSendTransactionX, useTokenX };
856
+ /** Reusable React Query key helper for deployment block lookups. */
857
+ const deploymentBlockKey = (chainId, address, floor) => ["deploymentBlock", chainId, address?.toLowerCase(), floor];
858
+ /**
859
+ * Internal helper: checks if there is bytecode at `address` on `blockNumber`.
860
+ */
861
+ async function hasCodeAtX(address, blockNumber, wagmiConfig) {
862
+ const client = getPublicClient(wagmiConfig);
863
+ if (!client)
864
+ throw new Error("Public client is missing");
865
+ const code = await client.getCode({ address, blockNumber });
866
+ return !!code && code !== "0x";
867
+ }
868
+ /**
869
+ * Internal helper: finds the earliest block where code exists at `address`,
870
+ * using exponential descent to find a lower bound and then binary search.
871
+ *
872
+ * @param address - Contract address to probe.
873
+ * @param floor - Optional lower bound (inclusive) to start from. If you know
874
+ * the contract cannot exist below this block, pass it to
875
+ * speed up the search. Defaults to `0n`.
876
+ * @returns The first block number (bigint) where code is present.
877
+ * @throws If no code exists at the latest block (i.e., contract not deployed).
878
+ */
879
+ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
880
+ const client = getPublicClient(wagmiConfig);
881
+ if (!client)
882
+ throw new Error("Public client is missing");
883
+ const latest = await client.getBlockNumber();
884
+ if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
885
+ const chainId = client.chain?.id ?? 0;
886
+ throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`);
887
+ }
888
+ // If caller-supplied floor already has code, it *is* the first code block.
889
+ if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))
890
+ return floor;
891
+ // Exponential descent to find a "no code" lower bound fast.
892
+ let lo = floor; // known (or assumed) no code
893
+ let hi = latest; // known has code
894
+ let step = 1n;
895
+ while (hi - step > lo) {
896
+ const probe = hi - step;
897
+ if (await hasCodeAtX(address, probe, wagmiConfig)) {
898
+ hi = probe; // still has code -> move upper bound down
899
+ step <<= 1n; // double the step
900
+ }
901
+ else {
902
+ lo = probe; // found a no-code block
903
+ break;
904
+ }
905
+ }
906
+ // Binary search to the first block with code in (lo, hi]
907
+ while (lo + 1n < hi) {
908
+ const mid = lo + (hi - lo) / 2n;
909
+ if (await hasCodeAtX(address, mid, wagmiConfig))
910
+ hi = mid;
911
+ else
912
+ lo = mid;
913
+ }
914
+ return hi;
915
+ }
916
+ /**
917
+ * Builds React Query options for caching the deployment block "forever".
918
+ *
919
+ * Use with `queryClient.fetchQuery(...)`.
920
+ *
921
+ * @param address - Contract address to probe.
922
+ * @param floor - Optional lower bound (inclusive) to speed up search. Defaults to `0n`.
923
+ * @param wagmiConfig - Wagmi `Config` (optional; resolved via `ensureClientAndConfig` if omitted).
924
+ *
925
+ * @returns A fully-configured query options object (key + fn + metadata).
926
+ */
927
+ function getDeploymentBlockQueryOptionsX(address, floor = 0n, wagmiConfig) {
928
+ if (!address)
929
+ throw new Error("Address is required");
930
+ // Resolve config (caller may pass undefined; we'll normalize later in fetcher too)
931
+ // We only need chainId for the key; if wagmiConfig is missing here,
932
+ // we allow it since fetcher re-resolves. But key stability benefits from chainId.
933
+ const client = wagmiConfig ? getPublicClient(wagmiConfig) : undefined;
934
+ const chainId = client?.chain?.id;
935
+ return {
936
+ queryKey: deploymentBlockKey(chainId, address, floor),
937
+ queryFn: async () => {
938
+ if (!wagmiConfig)
939
+ throw new Error("wagmiConfig is required at execution time");
940
+ return findDeploymentBlockRpcX(address, wagmiConfig, floor);
941
+ },
942
+ ...queryConfig.metaDataQuery,
943
+ };
944
+ }
945
+ /**
946
+ * Fetches (and caches) the first block where contract bytecode exists at `address`.
947
+ *
948
+ * Uses your shared `QueryClient` and Wagmi `Config` like other `fetch*X` helpers.
949
+ * Internally, this runs an **exponential descent** to find a safe lower bound,
950
+ * followed by an **optimal binary search** to pinpoint the exact deployment block.
951
+ *
952
+ * #### Caching
953
+ * - Query key: `["deploymentBlock", chainId, address.toLowerCase(), floor]`
954
+ * - For long-lived results, we apply `queryConfig.metaDataQuery` (tweak as needed).
955
+ *
956
+ * #### Performance
957
+ * - **O(log N)** `eth_getCode` calls, where `N` is the gap between the latest
958
+ * block and the deployment block—optimal among comparison-based strategies.
959
+ *
960
+ * @example
961
+ * ```ts
962
+ * const block = await fetchDeploymentBlockX("0xContract...", 0n, queryClient, wagmiConfig);
963
+ * ```
964
+ *
965
+ * @param address - Contract address to probe.
966
+ * @param floor - Optional lower bound (inclusive) to speed up search. Defaults to `0n`.
967
+ * @param queryClient - Optional TanStack `QueryClient`. If omitted, resolved by `ensureClientAndConfig`.
968
+ * @param wagmiConfig - Optional Wagmi `Config`. If omitted, resolved by `ensureClientAndConfig`.
969
+ *
970
+ * @returns The earliest block number (bigint) where bytecode exists.
971
+ *
972
+ * @throws If the public client is missing or if no code is present at the latest block.
973
+ */
974
+ async function fetchDeploymentBlockX(address, floor = 0n, queryClient, wagmiConfig) {
975
+ if (!address)
976
+ throw new Error("Address is required");
977
+ ({ queryClient, wagmiConfig } = ensureClientAndConfig(queryClient, wagmiConfig));
978
+ // Resolve chainId for a stable cache key
979
+ const client = getPublicClient(wagmiConfig);
980
+ const chainId = client?.chain?.id;
981
+ if (!chainId)
982
+ throw new Error("Client chain ID is missing");
983
+ return queryClient.fetchQuery({
984
+ ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig),
985
+ // Ensure the final key includes a concrete chainId
986
+ queryKey: deploymentBlockKey(chainId, address, floor),
987
+ // Reinstate metadata (in case your ensure/util merges)
988
+ ...queryConfig.metaDataQuery,
989
+ });
990
+ }
991
+
992
+ export { EthTokenData, HookFetchAssetAllowanceQK, HookFetchTokenQK, QueryType, deploymentBlockKey, fetchAllowanceX, fetchBalanceOfX, fetchDecimalsX, fetchDeploymentBlockX, fetchERC20DataX, fetchERC4626AssetX, fetchERC4626DataX, fetchERC4626MaxDepositX, fetchERC4626MaxMintX, fetchERC4626MaxRedeemX, fetchERC4626MaxWithdrawX, fetchERC4626TotalAssetsX, fetchNameX, fetchSymbolX, fetchTokenX, fetchTotalSupplyX, getDefaults, getDeploymentBlockQueryOptionsX, getErrorMapping, getParsedErrorX, queryConfig, resetErrorMapping, setDefaults, setErrorMapping, useContractWriteX, useERC20ApproveX, useFetchAssetAllowanceX, useHandleTransactionMutationX, useSendTransactionX, useTokenX };
840
993
  //# sourceMappingURL=index.esm.js.map