wagmi-extended 2.3.7 → 2.3.8

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,4 +1,4 @@
1
- import type { Address } from "viem";
1
+ import { type Address } from "viem";
2
2
  import type { QueryClient } from "@tanstack/react-query";
3
3
  import type { Config } from "wagmi";
4
4
  /** Reusable React Query key helper for deployment block lookups. */
@@ -23,6 +23,7 @@ export declare const deploymentBlockKey: (chainId: bigint | undefined, address:
23
23
  export declare function getDeploymentBlockQueryOptionsX(address: Address, floor?: bigint, wagmiConfig?: Config, options?: {
24
24
  disableLocalStorage?: boolean;
25
25
  chainId?: bigint;
26
+ allowFail?: boolean;
26
27
  }): {
27
28
  readonly staleTime: number;
28
29
  readonly meta: {
package/dist/index.cjs.js CHANGED
@@ -886,12 +886,24 @@ function writeDeploymentBlockToLS(chainId, address, floor, value) {
886
886
  /**
887
887
  * Internal helper: checks if there is bytecode at `address` on `blockNumber`.
888
888
  */
889
- async function hasCodeAtX(address, blockNumber, wagmiConfig) {
889
+ async function hasCodeAtX(address, blockNumber, wagmiConfig, allowFail = true) {
890
890
  const client = actions.getPublicClient(wagmiConfig);
891
891
  if (!client)
892
892
  throw new Error("Public client is missing");
893
- const code = await client.getCode({ address, blockNumber });
894
- return !!code && code !== "0x";
893
+ try {
894
+ const code = await client.getCode({ address, blockNumber });
895
+ return !!code && code !== "0x";
896
+ }
897
+ catch (err) {
898
+ const isPruned = err instanceof viem.InvalidParamsRpcError &&
899
+ typeof err.details === "string" &&
900
+ err.details.toLowerCase().includes("block requested not found");
901
+ if (allowFail && isPruned) {
902
+ console.warn(`[deploymentBlock] RPC pruned state for block ${blockNumber} — allowFail = true → treating as no-code`);
903
+ return false;
904
+ }
905
+ throw err;
906
+ }
895
907
  }
896
908
  /**
897
909
  * Internal helper: finds the earliest block where code exists at `address`,
@@ -904,17 +916,17 @@ async function hasCodeAtX(address, blockNumber, wagmiConfig) {
904
916
  * @returns The first block number (bigint) where code is present.
905
917
  * @throws If no code exists at the latest block (i.e., contract not deployed).
906
918
  */
907
- async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
919
+ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n, allowFail = true) {
908
920
  const client = actions.getPublicClient(wagmiConfig);
909
921
  if (!client)
910
922
  throw new Error("Public client is missing");
911
923
  const latest = await client.getBlockNumber();
912
- if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
924
+ if (!(await hasCodeAtX(address, latest, wagmiConfig, allowFail))) {
913
925
  const chainId = client.chain?.id ?? 0;
914
926
  throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`);
915
927
  }
916
928
  // If caller-supplied floor already has code, it *is* the first code block.
917
- if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))
929
+ if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig, allowFail)))
918
930
  return floor;
919
931
  // Exponential descent to find a "no code" lower bound fast.
920
932
  let lo = floor; // known (or assumed) no code
@@ -922,7 +934,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
922
934
  let step = 1n;
923
935
  while (hi - step > lo) {
924
936
  const probe = hi - step;
925
- if (await hasCodeAtX(address, probe, wagmiConfig)) {
937
+ if (await hasCodeAtX(address, probe, wagmiConfig, allowFail)) {
926
938
  hi = probe; // still has code -> move upper bound down
927
939
  step <<= 1n; // double the step
928
940
  }
@@ -934,7 +946,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
934
946
  // Binary search to the first block with code in (lo, hi]
935
947
  while (lo + 1n < hi) {
936
948
  const mid = lo + (hi - lo) / 2n;
937
- if (await hasCodeAtX(address, mid, wagmiConfig))
949
+ if (await hasCodeAtX(address, mid, wagmiConfig, allowFail))
938
950
  hi = mid;
939
951
  else
940
952
  lo = mid;
@@ -983,7 +995,7 @@ function getDeploymentBlockQueryOptionsX(address, floor = 0n, wagmiConfig, optio
983
995
  return fromLS;
984
996
  }
985
997
  // Otherwise do the discovery via RPC
986
- const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor);
998
+ const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor, options?.allowFail);
987
999
  // Persist to localStorage for subsequent sessions
988
1000
  if (!disableLocalStorage) {
989
1001
  writeDeploymentBlockToLS(finalChainId, address, floor, discovered);
@@ -1051,9 +1063,7 @@ async function fetchDeploymentBlockX(address, floor = 0n, options, queryClient,
1051
1063
  }
1052
1064
  }
1053
1065
  return queryClient.fetchQuery({
1054
- ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {
1055
- disableLocalStorage,
1056
- }),
1066
+ ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, options),
1057
1067
  // Ensure the final key includes a concrete chainId
1058
1068
  queryKey: key,
1059
1069
  // Reinstate metadata (in case your ensure/util merges)
@@ -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","../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","import { QueryClient } from \"@tanstack/react-query\"\nimport { Config } from \"wagmi\"\n\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(queryClient: QueryClient, wagmiConfig: Config): 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(\"Default configuration not set. Please call setDefaults() first.\")\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: bigint | undefined,\n address: Address | undefined,\n floor: bigint\n) => [\"deploymentBlock\", chainId, address?.toLowerCase(), floor] as const;\n\n/** Internal: SSR-safe localStorage guards */\nconst canUseBrowserStorage =\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\";\n\n/** Internal: build a stable localStorage key */\nconst lsKeyForDeploymentBlock = (\n chainId: bigint,\n address: Address,\n floor: bigint\n) =>\n `wagmi-extended:deploymentBlock:${chainId}:${address.toLowerCase()}:${floor.toString()}`;\n\n/** Internal: read bigint from localStorage (SSR safe) */\nfunction readDeploymentBlockFromLS(\n chainId: bigint,\n address: Address,\n floor: bigint\n): bigint | undefined {\n if (!canUseBrowserStorage) return undefined;\n try {\n const raw = window.localStorage.getItem(\n lsKeyForDeploymentBlock(chainId, address, floor)\n );\n return raw ? BigInt(raw) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Internal: write bigint to localStorage (SSR safe) */\nfunction writeDeploymentBlockToLS(\n chainId: bigint,\n address: Address,\n floor: bigint,\n value: bigint\n) {\n if (!canUseBrowserStorage) return;\n try {\n window.localStorage.setItem(\n lsKeyForDeploymentBlock(chainId, address, floor),\n value.toString()\n );\n } catch {\n /* ignore quota/security errors */\n }\n}\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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\n *\n * Local Storage behavior (SSR-safe):\n * - If not disabled and a value exists in `localStorage`, the `queryFn` will\n * return it immediately without performing RPC calls.\n * - After an on-chain discovery, the result is written to `localStorage`\n * (unless disabled). This pairs nicely with `staleTime: Infinity` to\n * avoid future refetches.\n */\nexport function getDeploymentBlockQueryOptionsX(\n address: Address,\n floor: bigint = 0n,\n wagmiConfig?: Config,\n options?: { disableLocalStorage?: boolean; chainId?: bigint }\n) {\n if (!address) throw new Error(\"Address is required\");\n const disableLocalStorage = options?.disableLocalStorage ?? false;\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 = options?.chainId || client?.chain?.id;\n const finalChainId = chainId ? BigInt(chainId) : undefined;\n\n return {\n queryKey: deploymentBlockKey(finalChainId, address, floor),\n queryFn: async () => {\n if (!wagmiConfig)\n throw new Error(\"wagmiConfig is required at execution time\");\n\n const c = getPublicClient(wagmiConfig);\n if (!finalChainId) throw new Error(\"Client chain ID is missing\");\n\n // Try localStorage first (no refetches if we already know it)\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor);\n if (fromLS !== undefined) return fromLS;\n }\n\n // Otherwise do the discovery via RPC\n const discovered = await findDeploymentBlockRpcX(\n address,\n wagmiConfig,\n floor\n );\n\n // Persist to localStorage for subsequent sessions\n if (!disableLocalStorage) {\n writeDeploymentBlockToLS(finalChainId, address, floor, discovered);\n }\n return discovered;\n },\n ...queryConfig.metaDataQuery, // typically sets staleTime: Infinity, gcTime, etc.\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 * - Long-lived results: `queryConfig.metaDataQuery` (e.g., `staleTime: Infinity`)\n *\n * #### Local Storage (SSR-safe)\n * - Before calling `fetchQuery`, we seed the Query Cache from `localStorage`\n * (unless `disableLocalStorage` is true). When a cached value is present,\n * `fetchQuery` will *not* execute the `queryFn`, fully preventing RPC refetches.\n * - After on-chain discovery, the result is written back to `localStorage`\n * (unless disabled).\n *\n * @example\n * ```ts\n * const block = await fetchDeploymentBlockX(\n * \"0xContract...\",\n * 0n,\n * queryClient,\n * wagmiConfig,\n * { disableLocalStorage: false }\n * );\n * ```\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive). 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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\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 options?: { disableLocalStorage?: boolean; chainId?: bigint },\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 const client = getPublicClient(wagmiConfig);\n const chainId = options?.chainId || client?.chain?.id;\n const finalChainId = chainId ? BigInt(chainId) : undefined;\n if (!finalChainId) throw new Error(\"Client chain ID is missing\");\n\n const key = deploymentBlockKey(finalChainId, address, floor);\n const disableLocalStorage = options?.disableLocalStorage ?? false;\n\n // Seed cache from localStorage so fetchQuery returns immediately w/o running queryFn\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor);\n if (fromLS !== undefined) {\n queryClient.setQueryData(key, fromLS);\n }\n }\n\n return queryClient.fetchQuery({\n ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {\n disableLocalStorage,\n }),\n // Ensure the final key includes a concrete chainId\n queryKey: key,\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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"}
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","import { QueryClient } from \"@tanstack/react-query\"\nimport { Config } from \"wagmi\"\n\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(queryClient: QueryClient, wagmiConfig: Config): 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(\"Default configuration not set. Please call setDefaults() first.\")\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 { InvalidParamsRpcError, type Address, type 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: bigint | undefined,\n address: Address | undefined,\n floor: bigint\n) => [\"deploymentBlock\", chainId, address?.toLowerCase(), floor] as const\n\n/** Internal: SSR-safe localStorage guards */\nconst canUseBrowserStorage =\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n\n/** Internal: build a stable localStorage key */\nconst lsKeyForDeploymentBlock = (chainId: bigint, address: Address, floor: bigint) =>\n `wagmi-extended:deploymentBlock:${chainId}:${address.toLowerCase()}:${floor.toString()}`\n\n/** Internal: read bigint from localStorage (SSR safe) */\nfunction readDeploymentBlockFromLS(\n chainId: bigint,\n address: Address,\n floor: bigint\n): bigint | undefined {\n if (!canUseBrowserStorage) return undefined\n try {\n const raw = window.localStorage.getItem(lsKeyForDeploymentBlock(chainId, address, floor))\n return raw ? BigInt(raw) : undefined\n } catch {\n return undefined\n }\n}\n\n/** Internal: write bigint to localStorage (SSR safe) */\nfunction writeDeploymentBlockToLS(chainId: bigint, address: Address, floor: bigint, value: bigint) {\n if (!canUseBrowserStorage) return\n try {\n window.localStorage.setItem(lsKeyForDeploymentBlock(chainId, address, floor), value.toString())\n } catch {\n /* ignore quota/security errors */\n }\n}\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 allowFail = true\n): Promise<boolean> {\n const client = getPublicClient(wagmiConfig)\n if (!client) throw new Error(\"Public client is missing\")\n\n try {\n const code = await client.getCode({ address, blockNumber })\n return !!code && code !== \"0x\"\n } catch (err: any) {\n const isPruned =\n err instanceof InvalidParamsRpcError &&\n typeof err.details === \"string\" &&\n err.details.toLowerCase().includes(\"block requested not found\")\n\n if (allowFail && isPruned) {\n console.warn(\n `[deploymentBlock] RPC pruned state for block ${blockNumber} — allowFail = true → treating as no-code`\n )\n return false\n }\n\n throw err\n }\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 allowFail = true\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, allowFail))) {\n const chainId = client.chain?.id ?? 0\n throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`)\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, allowFail))) 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, allowFail)) {\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, allowFail)) 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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\n *\n * Local Storage behavior (SSR-safe):\n * - If not disabled and a value exists in `localStorage`, the `queryFn` will\n * return it immediately without performing RPC calls.\n * - After an on-chain discovery, the result is written to `localStorage`\n * (unless disabled). This pairs nicely with `staleTime: Infinity` to\n * avoid future refetches.\n */\nexport function getDeploymentBlockQueryOptionsX(\n address: Address,\n floor: bigint = 0n,\n wagmiConfig?: Config,\n options?: { disableLocalStorage?: boolean; chainId?: bigint; allowFail?: boolean }\n) {\n if (!address) throw new Error(\"Address is required\")\n const disableLocalStorage = options?.disableLocalStorage ?? false\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 = options?.chainId || client?.chain?.id\n const finalChainId = chainId ? BigInt(chainId) : undefined\n\n return {\n queryKey: deploymentBlockKey(finalChainId, address, floor),\n queryFn: async () => {\n if (!wagmiConfig) throw new Error(\"wagmiConfig is required at execution time\")\n\n const c = getPublicClient(wagmiConfig)\n if (!finalChainId) throw new Error(\"Client chain ID is missing\")\n\n // Try localStorage first (no refetches if we already know it)\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor)\n if (fromLS !== undefined) return fromLS\n }\n\n // Otherwise do the discovery via RPC\n const discovered = await findDeploymentBlockRpcX(\n address,\n wagmiConfig,\n floor,\n options?.allowFail\n )\n\n // Persist to localStorage for subsequent sessions\n if (!disableLocalStorage) {\n writeDeploymentBlockToLS(finalChainId, address, floor, discovered)\n }\n return discovered\n },\n ...queryConfig.metaDataQuery, // typically sets staleTime: Infinity, gcTime, etc.\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 * - Long-lived results: `queryConfig.metaDataQuery` (e.g., `staleTime: Infinity`)\n *\n * #### Local Storage (SSR-safe)\n * - Before calling `fetchQuery`, we seed the Query Cache from `localStorage`\n * (unless `disableLocalStorage` is true). When a cached value is present,\n * `fetchQuery` will *not* execute the `queryFn`, fully preventing RPC refetches.\n * - After on-chain discovery, the result is written back to `localStorage`\n * (unless disabled).\n *\n * @example\n * ```ts\n * const block = await fetchDeploymentBlockX(\n * \"0xContract...\",\n * 0n,\n * queryClient,\n * wagmiConfig,\n * { disableLocalStorage: false }\n * );\n * ```\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive). 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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\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 options?: { disableLocalStorage?: boolean; chainId?: bigint },\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n if (!address) throw new Error(\"Address is required\")\n ;({ queryClient, wagmiConfig } = ensureClientAndConfig(queryClient, wagmiConfig))\n\n const client = getPublicClient(wagmiConfig)\n const chainId = options?.chainId || client?.chain?.id\n const finalChainId = chainId ? BigInt(chainId) : undefined\n if (!finalChainId) throw new Error(\"Client chain ID is missing\")\n\n const key = deploymentBlockKey(finalChainId, address, floor)\n const disableLocalStorage = options?.disableLocalStorage ?? false\n\n // Seed cache from localStorage so fetchQuery returns immediately w/o running queryFn\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor)\n if (fromLS !== undefined) {\n queryClient.setQueryData(key, fromLS)\n }\n }\n\n return queryClient.fetchQuery({\n ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, options),\n // Ensure the final key includes a concrete chainId\n queryKey: key,\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","InvalidParamsRpcError"],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -2,7 +2,7 @@ import { useConfig, usePublicClient, useWriteContract, useSendTransaction, useAc
2
2
  import { waitForTransactionReceipt, getPublicClient } from 'wagmi/actions';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { useQueryClient, useQuery } from '@tanstack/react-query';
5
- import { ContractFunctionRevertedError, erc20Abi, maxUint256, zeroAddress, erc4626Abi } from 'viem';
5
+ import { ContractFunctionRevertedError, erc20Abi, maxUint256, zeroAddress, erc4626Abi, InvalidParamsRpcError } from 'viem';
6
6
  import { readContractQueryOptions } from 'wagmi/query';
7
7
 
8
8
  /**
@@ -884,12 +884,24 @@ function writeDeploymentBlockToLS(chainId, address, floor, value) {
884
884
  /**
885
885
  * Internal helper: checks if there is bytecode at `address` on `blockNumber`.
886
886
  */
887
- async function hasCodeAtX(address, blockNumber, wagmiConfig) {
887
+ async function hasCodeAtX(address, blockNumber, wagmiConfig, allowFail = true) {
888
888
  const client = getPublicClient(wagmiConfig);
889
889
  if (!client)
890
890
  throw new Error("Public client is missing");
891
- const code = await client.getCode({ address, blockNumber });
892
- return !!code && code !== "0x";
891
+ try {
892
+ const code = await client.getCode({ address, blockNumber });
893
+ return !!code && code !== "0x";
894
+ }
895
+ catch (err) {
896
+ const isPruned = err instanceof InvalidParamsRpcError &&
897
+ typeof err.details === "string" &&
898
+ err.details.toLowerCase().includes("block requested not found");
899
+ if (allowFail && isPruned) {
900
+ console.warn(`[deploymentBlock] RPC pruned state for block ${blockNumber} — allowFail = true → treating as no-code`);
901
+ return false;
902
+ }
903
+ throw err;
904
+ }
893
905
  }
894
906
  /**
895
907
  * Internal helper: finds the earliest block where code exists at `address`,
@@ -902,17 +914,17 @@ async function hasCodeAtX(address, blockNumber, wagmiConfig) {
902
914
  * @returns The first block number (bigint) where code is present.
903
915
  * @throws If no code exists at the latest block (i.e., contract not deployed).
904
916
  */
905
- async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
917
+ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n, allowFail = true) {
906
918
  const client = getPublicClient(wagmiConfig);
907
919
  if (!client)
908
920
  throw new Error("Public client is missing");
909
921
  const latest = await client.getBlockNumber();
910
- if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
922
+ if (!(await hasCodeAtX(address, latest, wagmiConfig, allowFail))) {
911
923
  const chainId = client.chain?.id ?? 0;
912
924
  throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`);
913
925
  }
914
926
  // If caller-supplied floor already has code, it *is* the first code block.
915
- if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))
927
+ if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig, allowFail)))
916
928
  return floor;
917
929
  // Exponential descent to find a "no code" lower bound fast.
918
930
  let lo = floor; // known (or assumed) no code
@@ -920,7 +932,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
920
932
  let step = 1n;
921
933
  while (hi - step > lo) {
922
934
  const probe = hi - step;
923
- if (await hasCodeAtX(address, probe, wagmiConfig)) {
935
+ if (await hasCodeAtX(address, probe, wagmiConfig, allowFail)) {
924
936
  hi = probe; // still has code -> move upper bound down
925
937
  step <<= 1n; // double the step
926
938
  }
@@ -932,7 +944,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
932
944
  // Binary search to the first block with code in (lo, hi]
933
945
  while (lo + 1n < hi) {
934
946
  const mid = lo + (hi - lo) / 2n;
935
- if (await hasCodeAtX(address, mid, wagmiConfig))
947
+ if (await hasCodeAtX(address, mid, wagmiConfig, allowFail))
936
948
  hi = mid;
937
949
  else
938
950
  lo = mid;
@@ -981,7 +993,7 @@ function getDeploymentBlockQueryOptionsX(address, floor = 0n, wagmiConfig, optio
981
993
  return fromLS;
982
994
  }
983
995
  // Otherwise do the discovery via RPC
984
- const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor);
996
+ const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor, options?.allowFail);
985
997
  // Persist to localStorage for subsequent sessions
986
998
  if (!disableLocalStorage) {
987
999
  writeDeploymentBlockToLS(finalChainId, address, floor, discovered);
@@ -1049,9 +1061,7 @@ async function fetchDeploymentBlockX(address, floor = 0n, options, queryClient,
1049
1061
  }
1050
1062
  }
1051
1063
  return queryClient.fetchQuery({
1052
- ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {
1053
- disableLocalStorage,
1054
- }),
1064
+ ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, options),
1055
1065
  // Ensure the final key includes a concrete chainId
1056
1066
  queryKey: key,
1057
1067
  // Reinstate metadata (in case your ensure/util merges)
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.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","import { QueryClient } from \"@tanstack/react-query\"\nimport { Config } from \"wagmi\"\n\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(queryClient: QueryClient, wagmiConfig: Config): 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(\"Default configuration not set. Please call setDefaults() first.\")\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: bigint | undefined,\n address: Address | undefined,\n floor: bigint\n) => [\"deploymentBlock\", chainId, address?.toLowerCase(), floor] as const;\n\n/** Internal: SSR-safe localStorage guards */\nconst canUseBrowserStorage =\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\";\n\n/** Internal: build a stable localStorage key */\nconst lsKeyForDeploymentBlock = (\n chainId: bigint,\n address: Address,\n floor: bigint\n) =>\n `wagmi-extended:deploymentBlock:${chainId}:${address.toLowerCase()}:${floor.toString()}`;\n\n/** Internal: read bigint from localStorage (SSR safe) */\nfunction readDeploymentBlockFromLS(\n chainId: bigint,\n address: Address,\n floor: bigint\n): bigint | undefined {\n if (!canUseBrowserStorage) return undefined;\n try {\n const raw = window.localStorage.getItem(\n lsKeyForDeploymentBlock(chainId, address, floor)\n );\n return raw ? BigInt(raw) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Internal: write bigint to localStorage (SSR safe) */\nfunction writeDeploymentBlockToLS(\n chainId: bigint,\n address: Address,\n floor: bigint,\n value: bigint\n) {\n if (!canUseBrowserStorage) return;\n try {\n window.localStorage.setItem(\n lsKeyForDeploymentBlock(chainId, address, floor),\n value.toString()\n );\n } catch {\n /* ignore quota/security errors */\n }\n}\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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\n *\n * Local Storage behavior (SSR-safe):\n * - If not disabled and a value exists in `localStorage`, the `queryFn` will\n * return it immediately without performing RPC calls.\n * - After an on-chain discovery, the result is written to `localStorage`\n * (unless disabled). This pairs nicely with `staleTime: Infinity` to\n * avoid future refetches.\n */\nexport function getDeploymentBlockQueryOptionsX(\n address: Address,\n floor: bigint = 0n,\n wagmiConfig?: Config,\n options?: { disableLocalStorage?: boolean; chainId?: bigint }\n) {\n if (!address) throw new Error(\"Address is required\");\n const disableLocalStorage = options?.disableLocalStorage ?? false;\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 = options?.chainId || client?.chain?.id;\n const finalChainId = chainId ? BigInt(chainId) : undefined;\n\n return {\n queryKey: deploymentBlockKey(finalChainId, address, floor),\n queryFn: async () => {\n if (!wagmiConfig)\n throw new Error(\"wagmiConfig is required at execution time\");\n\n const c = getPublicClient(wagmiConfig);\n if (!finalChainId) throw new Error(\"Client chain ID is missing\");\n\n // Try localStorage first (no refetches if we already know it)\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor);\n if (fromLS !== undefined) return fromLS;\n }\n\n // Otherwise do the discovery via RPC\n const discovered = await findDeploymentBlockRpcX(\n address,\n wagmiConfig,\n floor\n );\n\n // Persist to localStorage for subsequent sessions\n if (!disableLocalStorage) {\n writeDeploymentBlockToLS(finalChainId, address, floor, discovered);\n }\n return discovered;\n },\n ...queryConfig.metaDataQuery, // typically sets staleTime: Infinity, gcTime, etc.\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 * - Long-lived results: `queryConfig.metaDataQuery` (e.g., `staleTime: Infinity`)\n *\n * #### Local Storage (SSR-safe)\n * - Before calling `fetchQuery`, we seed the Query Cache from `localStorage`\n * (unless `disableLocalStorage` is true). When a cached value is present,\n * `fetchQuery` will *not* execute the `queryFn`, fully preventing RPC refetches.\n * - After on-chain discovery, the result is written back to `localStorage`\n * (unless disabled).\n *\n * @example\n * ```ts\n * const block = await fetchDeploymentBlockX(\n * \"0xContract...\",\n * 0n,\n * queryClient,\n * wagmiConfig,\n * { disableLocalStorage: false }\n * );\n * ```\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive). 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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\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 options?: { disableLocalStorage?: boolean; chainId?: bigint },\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 const client = getPublicClient(wagmiConfig);\n const chainId = options?.chainId || client?.chain?.id;\n const finalChainId = chainId ? BigInt(chainId) : undefined;\n if (!finalChainId) throw new Error(\"Client chain ID is missing\");\n\n const key = deploymentBlockKey(finalChainId, address, floor);\n const disableLocalStorage = options?.disableLocalStorage ?? false;\n\n // Seed cache from localStorage so fetchQuery returns immediately w/o running queryFn\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor);\n if (fromLS !== undefined) {\n queryClient.setQueryData(key, fromLS);\n }\n }\n\n return queryClient.fetchQuery({\n ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {\n disableLocalStorage,\n }),\n // Ensure the final key includes a concrete chainId\n queryKey: key,\n // Reinstate metadata (in case your ensure/util merges)\n ...queryConfig.metaDataQuery,\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.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","import { QueryClient } from \"@tanstack/react-query\"\nimport { Config } from \"wagmi\"\n\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(queryClient: QueryClient, wagmiConfig: Config): 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(\"Default configuration not set. Please call setDefaults() first.\")\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 { InvalidParamsRpcError, type Address, type 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: bigint | undefined,\n address: Address | undefined,\n floor: bigint\n) => [\"deploymentBlock\", chainId, address?.toLowerCase(), floor] as const\n\n/** Internal: SSR-safe localStorage guards */\nconst canUseBrowserStorage =\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n\n/** Internal: build a stable localStorage key */\nconst lsKeyForDeploymentBlock = (chainId: bigint, address: Address, floor: bigint) =>\n `wagmi-extended:deploymentBlock:${chainId}:${address.toLowerCase()}:${floor.toString()}`\n\n/** Internal: read bigint from localStorage (SSR safe) */\nfunction readDeploymentBlockFromLS(\n chainId: bigint,\n address: Address,\n floor: bigint\n): bigint | undefined {\n if (!canUseBrowserStorage) return undefined\n try {\n const raw = window.localStorage.getItem(lsKeyForDeploymentBlock(chainId, address, floor))\n return raw ? BigInt(raw) : undefined\n } catch {\n return undefined\n }\n}\n\n/** Internal: write bigint to localStorage (SSR safe) */\nfunction writeDeploymentBlockToLS(chainId: bigint, address: Address, floor: bigint, value: bigint) {\n if (!canUseBrowserStorage) return\n try {\n window.localStorage.setItem(lsKeyForDeploymentBlock(chainId, address, floor), value.toString())\n } catch {\n /* ignore quota/security errors */\n }\n}\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 allowFail = true\n): Promise<boolean> {\n const client = getPublicClient(wagmiConfig)\n if (!client) throw new Error(\"Public client is missing\")\n\n try {\n const code = await client.getCode({ address, blockNumber })\n return !!code && code !== \"0x\"\n } catch (err: any) {\n const isPruned =\n err instanceof InvalidParamsRpcError &&\n typeof err.details === \"string\" &&\n err.details.toLowerCase().includes(\"block requested not found\")\n\n if (allowFail && isPruned) {\n console.warn(\n `[deploymentBlock] RPC pruned state for block ${blockNumber} — allowFail = true → treating as no-code`\n )\n return false\n }\n\n throw err\n }\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 allowFail = true\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, allowFail))) {\n const chainId = client.chain?.id ?? 0\n throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`)\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, allowFail))) 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, allowFail)) {\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, allowFail)) 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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\n *\n * Local Storage behavior (SSR-safe):\n * - If not disabled and a value exists in `localStorage`, the `queryFn` will\n * return it immediately without performing RPC calls.\n * - After an on-chain discovery, the result is written to `localStorage`\n * (unless disabled). This pairs nicely with `staleTime: Infinity` to\n * avoid future refetches.\n */\nexport function getDeploymentBlockQueryOptionsX(\n address: Address,\n floor: bigint = 0n,\n wagmiConfig?: Config,\n options?: { disableLocalStorage?: boolean; chainId?: bigint; allowFail?: boolean }\n) {\n if (!address) throw new Error(\"Address is required\")\n const disableLocalStorage = options?.disableLocalStorage ?? false\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 = options?.chainId || client?.chain?.id\n const finalChainId = chainId ? BigInt(chainId) : undefined\n\n return {\n queryKey: deploymentBlockKey(finalChainId, address, floor),\n queryFn: async () => {\n if (!wagmiConfig) throw new Error(\"wagmiConfig is required at execution time\")\n\n const c = getPublicClient(wagmiConfig)\n if (!finalChainId) throw new Error(\"Client chain ID is missing\")\n\n // Try localStorage first (no refetches if we already know it)\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor)\n if (fromLS !== undefined) return fromLS\n }\n\n // Otherwise do the discovery via RPC\n const discovered = await findDeploymentBlockRpcX(\n address,\n wagmiConfig,\n floor,\n options?.allowFail\n )\n\n // Persist to localStorage for subsequent sessions\n if (!disableLocalStorage) {\n writeDeploymentBlockToLS(finalChainId, address, floor, discovered)\n }\n return discovered\n },\n ...queryConfig.metaDataQuery, // typically sets staleTime: Infinity, gcTime, etc.\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 * - Long-lived results: `queryConfig.metaDataQuery` (e.g., `staleTime: Infinity`)\n *\n * #### Local Storage (SSR-safe)\n * - Before calling `fetchQuery`, we seed the Query Cache from `localStorage`\n * (unless `disableLocalStorage` is true). When a cached value is present,\n * `fetchQuery` will *not* execute the `queryFn`, fully preventing RPC refetches.\n * - After on-chain discovery, the result is written back to `localStorage`\n * (unless disabled).\n *\n * @example\n * ```ts\n * const block = await fetchDeploymentBlockX(\n * \"0xContract...\",\n * 0n,\n * queryClient,\n * wagmiConfig,\n * { disableLocalStorage: false }\n * );\n * ```\n *\n * @param address - Contract address to probe.\n * @param floor - Optional lower bound (inclusive). 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 * @param options.disableLocalStorage - If `true`, skip reading/writing localStorage (default `false`).\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 options?: { disableLocalStorage?: boolean; chainId?: bigint },\n queryClient?: QueryClient,\n wagmiConfig?: Config\n): Promise<bigint> {\n if (!address) throw new Error(\"Address is required\")\n ;({ queryClient, wagmiConfig } = ensureClientAndConfig(queryClient, wagmiConfig))\n\n const client = getPublicClient(wagmiConfig)\n const chainId = options?.chainId || client?.chain?.id\n const finalChainId = chainId ? BigInt(chainId) : undefined\n if (!finalChainId) throw new Error(\"Client chain ID is missing\")\n\n const key = deploymentBlockKey(finalChainId, address, floor)\n const disableLocalStorage = options?.disableLocalStorage ?? false\n\n // Seed cache from localStorage so fetchQuery returns immediately w/o running queryFn\n if (!disableLocalStorage) {\n const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor)\n if (fromLS !== undefined) {\n queryClient.setQueryData(key, fromLS)\n }\n }\n\n return queryClient.fetchQuery({\n ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, options),\n // Ensure the final key includes a concrete chainId\n queryKey: key,\n // Reinstate metadata (in case your ensure/util merges)\n ...queryConfig.metaDataQuery,\n })\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wagmi-extended",
3
- "version": "2.3.7",
3
+ "version": "2.3.8",
4
4
  "type": "module",
5
5
  "description": "A library providing extended hooks on top of Wagmi with additional hooks and features.",
6
6
  "main": "dist/index.cjs.js",
@@ -1,28 +1,24 @@
1
- import type { Address, Hex } from "viem";
2
- import type { QueryClient } from "@tanstack/react-query";
3
- import type { Config } from "wagmi";
4
- import { getPublicClient } from "wagmi/actions";
5
- import { queryConfig } from "../../query-config/index.js";
6
- import { ensureClientAndConfig } from "../../utils/ensureClientAndConfig.js";
1
+ import { InvalidParamsRpcError, type Address, type Hex } from "viem"
2
+ import type { QueryClient } from "@tanstack/react-query"
3
+ import type { Config } from "wagmi"
4
+ import { getPublicClient } from "wagmi/actions"
5
+ import { queryConfig } from "../../query-config/index.js"
6
+ import { ensureClientAndConfig } from "../../utils/ensureClientAndConfig.js"
7
7
 
8
8
  /** Reusable React Query key helper for deployment block lookups. */
9
9
  export const deploymentBlockKey = (
10
10
  chainId: bigint | undefined,
11
11
  address: Address | undefined,
12
12
  floor: bigint
13
- ) => ["deploymentBlock", chainId, address?.toLowerCase(), floor] as const;
13
+ ) => ["deploymentBlock", chainId, address?.toLowerCase(), floor] as const
14
14
 
15
15
  /** Internal: SSR-safe localStorage guards */
16
16
  const canUseBrowserStorage =
17
- typeof window !== "undefined" && typeof window.localStorage !== "undefined";
17
+ typeof window !== "undefined" && typeof window.localStorage !== "undefined"
18
18
 
19
19
  /** Internal: build a stable localStorage key */
20
- const lsKeyForDeploymentBlock = (
21
- chainId: bigint,
22
- address: Address,
23
- floor: bigint
24
- ) =>
25
- `wagmi-extended:deploymentBlock:${chainId}:${address.toLowerCase()}:${floor.toString()}`;
20
+ const lsKeyForDeploymentBlock = (chainId: bigint, address: Address, floor: bigint) =>
21
+ `wagmi-extended:deploymentBlock:${chainId}:${address.toLowerCase()}:${floor.toString()}`
26
22
 
27
23
  /** Internal: read bigint from localStorage (SSR safe) */
28
24
  function readDeploymentBlockFromLS(
@@ -30,30 +26,20 @@ function readDeploymentBlockFromLS(
30
26
  address: Address,
31
27
  floor: bigint
32
28
  ): bigint | undefined {
33
- if (!canUseBrowserStorage) return undefined;
29
+ if (!canUseBrowserStorage) return undefined
34
30
  try {
35
- const raw = window.localStorage.getItem(
36
- lsKeyForDeploymentBlock(chainId, address, floor)
37
- );
38
- return raw ? BigInt(raw) : undefined;
31
+ const raw = window.localStorage.getItem(lsKeyForDeploymentBlock(chainId, address, floor))
32
+ return raw ? BigInt(raw) : undefined
39
33
  } catch {
40
- return undefined;
34
+ return undefined
41
35
  }
42
36
  }
43
37
 
44
38
  /** Internal: write bigint to localStorage (SSR safe) */
45
- function writeDeploymentBlockToLS(
46
- chainId: bigint,
47
- address: Address,
48
- floor: bigint,
49
- value: bigint
50
- ) {
51
- if (!canUseBrowserStorage) return;
39
+ function writeDeploymentBlockToLS(chainId: bigint, address: Address, floor: bigint, value: bigint) {
40
+ if (!canUseBrowserStorage) return
52
41
  try {
53
- window.localStorage.setItem(
54
- lsKeyForDeploymentBlock(chainId, address, floor),
55
- value.toString()
56
- );
42
+ window.localStorage.setItem(lsKeyForDeploymentBlock(chainId, address, floor), value.toString())
57
43
  } catch {
58
44
  /* ignore quota/security errors */
59
45
  }
@@ -65,12 +51,30 @@ function writeDeploymentBlockToLS(
65
51
  async function hasCodeAtX(
66
52
  address: Address,
67
53
  blockNumber: bigint,
68
- wagmiConfig: Config
54
+ wagmiConfig: Config,
55
+ allowFail = true
69
56
  ): Promise<boolean> {
70
- const client = getPublicClient(wagmiConfig);
71
- if (!client) throw new Error("Public client is missing");
72
- const code: Hex | undefined = await client.getCode({ address, blockNumber });
73
- return !!code && code !== "0x";
57
+ const client = getPublicClient(wagmiConfig)
58
+ if (!client) throw new Error("Public client is missing")
59
+
60
+ try {
61
+ const code = await client.getCode({ address, blockNumber })
62
+ return !!code && code !== "0x"
63
+ } catch (err: any) {
64
+ const isPruned =
65
+ err instanceof InvalidParamsRpcError &&
66
+ typeof err.details === "string" &&
67
+ err.details.toLowerCase().includes("block requested not found")
68
+
69
+ if (allowFail && isPruned) {
70
+ console.warn(
71
+ `[deploymentBlock] RPC pruned state for block ${blockNumber} — allowFail = true → treating as no-code`
72
+ )
73
+ return false
74
+ }
75
+
76
+ throw err
77
+ }
74
78
  }
75
79
 
76
80
  /**
@@ -87,46 +91,44 @@ async function hasCodeAtX(
87
91
  async function findDeploymentBlockRpcX(
88
92
  address: Address,
89
93
  wagmiConfig: Config,
90
- floor: bigint = 0n
94
+ floor: bigint = 0n,
95
+ allowFail = true
91
96
  ): Promise<bigint> {
92
- const client = getPublicClient(wagmiConfig);
93
- if (!client) throw new Error("Public client is missing");
97
+ const client = getPublicClient(wagmiConfig)
98
+ if (!client) throw new Error("Public client is missing")
94
99
 
95
- const latest = await client.getBlockNumber();
96
- if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
97
- const chainId = client.chain?.id ?? 0;
98
- throw new Error(
99
- `No code for ${address} at latest block ${latest} on chain ${chainId}.`
100
- );
100
+ const latest = await client.getBlockNumber()
101
+ if (!(await hasCodeAtX(address, latest, wagmiConfig, allowFail))) {
102
+ const chainId = client.chain?.id ?? 0
103
+ throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`)
101
104
  }
102
105
 
103
106
  // If caller-supplied floor already has code, it *is* the first code block.
104
- if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))
105
- return floor;
107
+ if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig, allowFail))) return floor
106
108
 
107
109
  // Exponential descent to find a "no code" lower bound fast.
108
- let lo = floor; // known (or assumed) no code
109
- let hi = latest; // known has code
110
- let step = 1n;
110
+ let lo = floor // known (or assumed) no code
111
+ let hi = latest // known has code
112
+ let step = 1n
111
113
 
112
114
  while (hi - step > lo) {
113
- const probe = hi - step;
114
- if (await hasCodeAtX(address, probe, wagmiConfig)) {
115
- hi = probe; // still has code -> move upper bound down
116
- step <<= 1n; // double the step
115
+ const probe = hi - step
116
+ if (await hasCodeAtX(address, probe, wagmiConfig, allowFail)) {
117
+ hi = probe // still has code -> move upper bound down
118
+ step <<= 1n // double the step
117
119
  } else {
118
- lo = probe; // found a no-code block
119
- break;
120
+ lo = probe // found a no-code block
121
+ break
120
122
  }
121
123
  }
122
124
 
123
125
  // Binary search to the first block with code in (lo, hi]
124
126
  while (lo + 1n < hi) {
125
- const mid = lo + (hi - lo) / 2n;
126
- if (await hasCodeAtX(address, mid, wagmiConfig)) hi = mid;
127
- else lo = mid;
127
+ const mid = lo + (hi - lo) / 2n
128
+ if (await hasCodeAtX(address, mid, wagmiConfig, allowFail)) hi = mid
129
+ else lo = mid
128
130
  }
129
- return hi;
131
+ return hi
130
132
  }
131
133
 
132
134
  /**
@@ -150,48 +152,48 @@ export function getDeploymentBlockQueryOptionsX(
150
152
  address: Address,
151
153
  floor: bigint = 0n,
152
154
  wagmiConfig?: Config,
153
- options?: { disableLocalStorage?: boolean; chainId?: bigint }
155
+ options?: { disableLocalStorage?: boolean; chainId?: bigint; allowFail?: boolean }
154
156
  ) {
155
- if (!address) throw new Error("Address is required");
156
- const disableLocalStorage = options?.disableLocalStorage ?? false;
157
+ if (!address) throw new Error("Address is required")
158
+ const disableLocalStorage = options?.disableLocalStorage ?? false
157
159
 
158
160
  // Resolve config (caller may pass undefined; we'll normalize later in fetcher too)
159
161
  // We only need chainId for the key; if wagmiConfig is missing here,
160
162
  // we allow it since fetcher re-resolves. But key stability benefits from chainId.
161
- const client = wagmiConfig ? getPublicClient(wagmiConfig) : undefined;
162
- const chainId = options?.chainId || client?.chain?.id;
163
- const finalChainId = chainId ? BigInt(chainId) : undefined;
163
+ const client = wagmiConfig ? getPublicClient(wagmiConfig) : undefined
164
+ const chainId = options?.chainId || client?.chain?.id
165
+ const finalChainId = chainId ? BigInt(chainId) : undefined
164
166
 
165
167
  return {
166
168
  queryKey: deploymentBlockKey(finalChainId, address, floor),
167
169
  queryFn: async () => {
168
- if (!wagmiConfig)
169
- throw new Error("wagmiConfig is required at execution time");
170
+ if (!wagmiConfig) throw new Error("wagmiConfig is required at execution time")
170
171
 
171
- const c = getPublicClient(wagmiConfig);
172
- if (!finalChainId) throw new Error("Client chain ID is missing");
172
+ const c = getPublicClient(wagmiConfig)
173
+ if (!finalChainId) throw new Error("Client chain ID is missing")
173
174
 
174
175
  // Try localStorage first (no refetches if we already know it)
175
176
  if (!disableLocalStorage) {
176
- const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor);
177
- if (fromLS !== undefined) return fromLS;
177
+ const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor)
178
+ if (fromLS !== undefined) return fromLS
178
179
  }
179
180
 
180
181
  // Otherwise do the discovery via RPC
181
182
  const discovered = await findDeploymentBlockRpcX(
182
183
  address,
183
184
  wagmiConfig,
184
- floor
185
- );
185
+ floor,
186
+ options?.allowFail
187
+ )
186
188
 
187
189
  // Persist to localStorage for subsequent sessions
188
190
  if (!disableLocalStorage) {
189
- writeDeploymentBlockToLS(finalChainId, address, floor, discovered);
191
+ writeDeploymentBlockToLS(finalChainId, address, floor, discovered)
190
192
  }
191
- return discovered;
193
+ return discovered
192
194
  },
193
195
  ...queryConfig.metaDataQuery, // typically sets staleTime: Infinity, gcTime, etc.
194
- } as const;
196
+ } as const
195
197
  }
196
198
 
197
199
  /**
@@ -240,36 +242,30 @@ export async function fetchDeploymentBlockX(
240
242
  queryClient?: QueryClient,
241
243
  wagmiConfig?: Config
242
244
  ): Promise<bigint> {
243
- if (!address) throw new Error("Address is required");
244
-
245
- ({ queryClient, wagmiConfig } = ensureClientAndConfig(
246
- queryClient,
247
- wagmiConfig
248
- ));
245
+ if (!address) throw new Error("Address is required")
246
+ ;({ queryClient, wagmiConfig } = ensureClientAndConfig(queryClient, wagmiConfig))
249
247
 
250
- const client = getPublicClient(wagmiConfig);
251
- const chainId = options?.chainId || client?.chain?.id;
252
- const finalChainId = chainId ? BigInt(chainId) : undefined;
253
- if (!finalChainId) throw new Error("Client chain ID is missing");
248
+ const client = getPublicClient(wagmiConfig)
249
+ const chainId = options?.chainId || client?.chain?.id
250
+ const finalChainId = chainId ? BigInt(chainId) : undefined
251
+ if (!finalChainId) throw new Error("Client chain ID is missing")
254
252
 
255
- const key = deploymentBlockKey(finalChainId, address, floor);
256
- const disableLocalStorage = options?.disableLocalStorage ?? false;
253
+ const key = deploymentBlockKey(finalChainId, address, floor)
254
+ const disableLocalStorage = options?.disableLocalStorage ?? false
257
255
 
258
256
  // Seed cache from localStorage so fetchQuery returns immediately w/o running queryFn
259
257
  if (!disableLocalStorage) {
260
- const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor);
258
+ const fromLS = readDeploymentBlockFromLS(finalChainId, address, floor)
261
259
  if (fromLS !== undefined) {
262
- queryClient.setQueryData(key, fromLS);
260
+ queryClient.setQueryData(key, fromLS)
263
261
  }
264
262
  }
265
263
 
266
264
  return queryClient.fetchQuery({
267
- ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {
268
- disableLocalStorage,
269
- }),
265
+ ...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, options),
270
266
  // Ensure the final key includes a concrete chainId
271
267
  queryKey: key,
272
268
  // Reinstate metadata (in case your ensure/util merges)
273
269
  ...queryConfig.metaDataQuery,
274
- });
270
+ })
275
271
  }