wagmi-extended 2.3.8 → 2.3.9
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.
- package/dist/fetch-functions/common/fetchDeploymentBlockX.d.ts +1 -2
- package/dist/index.cjs.js +12 -22
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +13 -23
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/fetch-functions/common/fetchDeploymentBlockX.ts +15 -36
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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,7 +23,6 @@ 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;
|
|
27
26
|
}): {
|
|
28
27
|
readonly staleTime: number;
|
|
29
28
|
readonly meta: {
|
package/dist/index.cjs.js
CHANGED
|
@@ -886,24 +886,12 @@ 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) {
|
|
890
890
|
const client = actions.getPublicClient(wagmiConfig);
|
|
891
891
|
if (!client)
|
|
892
892
|
throw new Error("Public client is missing");
|
|
893
|
-
|
|
894
|
-
|
|
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
|
-
}
|
|
893
|
+
const code = await client.getCode({ address, blockNumber });
|
|
894
|
+
return !!code && code !== "0x";
|
|
907
895
|
}
|
|
908
896
|
/**
|
|
909
897
|
* Internal helper: finds the earliest block where code exists at `address`,
|
|
@@ -916,17 +904,17 @@ async function hasCodeAtX(address, blockNumber, wagmiConfig, allowFail = true) {
|
|
|
916
904
|
* @returns The first block number (bigint) where code is present.
|
|
917
905
|
* @throws If no code exists at the latest block (i.e., contract not deployed).
|
|
918
906
|
*/
|
|
919
|
-
async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n
|
|
907
|
+
async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
|
|
920
908
|
const client = actions.getPublicClient(wagmiConfig);
|
|
921
909
|
if (!client)
|
|
922
910
|
throw new Error("Public client is missing");
|
|
923
911
|
const latest = await client.getBlockNumber();
|
|
924
|
-
if (!(await hasCodeAtX(address, latest, wagmiConfig
|
|
912
|
+
if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
|
|
925
913
|
const chainId = client.chain?.id ?? 0;
|
|
926
914
|
throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`);
|
|
927
915
|
}
|
|
928
916
|
// If caller-supplied floor already has code, it *is* the first code block.
|
|
929
|
-
if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig
|
|
917
|
+
if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))
|
|
930
918
|
return floor;
|
|
931
919
|
// Exponential descent to find a "no code" lower bound fast.
|
|
932
920
|
let lo = floor; // known (or assumed) no code
|
|
@@ -934,7 +922,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n, allowFa
|
|
|
934
922
|
let step = 1n;
|
|
935
923
|
while (hi - step > lo) {
|
|
936
924
|
const probe = hi - step;
|
|
937
|
-
if (await hasCodeAtX(address, probe, wagmiConfig
|
|
925
|
+
if (await hasCodeAtX(address, probe, wagmiConfig)) {
|
|
938
926
|
hi = probe; // still has code -> move upper bound down
|
|
939
927
|
step <<= 1n; // double the step
|
|
940
928
|
}
|
|
@@ -946,7 +934,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n, allowFa
|
|
|
946
934
|
// Binary search to the first block with code in (lo, hi]
|
|
947
935
|
while (lo + 1n < hi) {
|
|
948
936
|
const mid = lo + (hi - lo) / 2n;
|
|
949
|
-
if (await hasCodeAtX(address, mid, wagmiConfig
|
|
937
|
+
if (await hasCodeAtX(address, mid, wagmiConfig))
|
|
950
938
|
hi = mid;
|
|
951
939
|
else
|
|
952
940
|
lo = mid;
|
|
@@ -995,7 +983,7 @@ function getDeploymentBlockQueryOptionsX(address, floor = 0n, wagmiConfig, optio
|
|
|
995
983
|
return fromLS;
|
|
996
984
|
}
|
|
997
985
|
// Otherwise do the discovery via RPC
|
|
998
|
-
const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor
|
|
986
|
+
const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor);
|
|
999
987
|
// Persist to localStorage for subsequent sessions
|
|
1000
988
|
if (!disableLocalStorage) {
|
|
1001
989
|
writeDeploymentBlockToLS(finalChainId, address, floor, discovered);
|
|
@@ -1063,7 +1051,9 @@ async function fetchDeploymentBlockX(address, floor = 0n, options, queryClient,
|
|
|
1063
1051
|
}
|
|
1064
1052
|
}
|
|
1065
1053
|
return queryClient.fetchQuery({
|
|
1066
|
-
...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig,
|
|
1054
|
+
...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {
|
|
1055
|
+
disableLocalStorage,
|
|
1056
|
+
}),
|
|
1067
1057
|
// Ensure the final key includes a concrete chainId
|
|
1068
1058
|
queryKey: key,
|
|
1069
1059
|
// Reinstate metadata (in case your ensure/util merges)
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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 { 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":";;;;;;;;;AAEA;;;;AAIG;SACa,oBAAoB,GAAA;AAClC,IAAA,MAAM,WAAW,GAAGA,yBAAc,EAAE;AAEpC,IAAA,MAAM,cAAc,GAAG,OAAO,OAAiC,KAAI;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,KACpC,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAC5C;AACD,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7B,KAAC;IAED,OAAO,EAAE,cAAc,EAAE;AAC3B;;AChBA;;AAEG;AACH,MAAM,mBAAmB,GAA2B;AAClD,IAAA,aAAa,EAAE,8DAA8D;AAC7E,IAAA,uBAAuB,EACrB,0DAA0D;AAC5D,IAAA,YAAY,EAAE,0DAA0D;AACxE,IAAA,0BAA0B,EACxB,kEAAkE;AACpE,IAAA,YAAY,EACV,kEAAkE;AACpE,IAAA,mBAAmB,EACjB,kEAAkE;AACpE,IAAA,IAAI,EAAE,qBAAqB;CAC5B;AAED;;AAEG;AACH,IAAI,mBAAmB,GAA2B,EAAE,GAAG,mBAAmB,EAAE;AAE5E;;;;;;;;;;;AAWG;AACU,MAAA,eAAe,GAAG,CAC7B,aAAqC,KAC7B;IACR,mBAAmB,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,aAAa,EAAE;AACpE;AAEA;;;;;AAKG;AACI,MAAM,iBAAiB,GAAG,MAAW;IAC1C,mBAAmB,GAAG,EAAE;AAC1B;AAEA;;;;;;;;AAQG;MACU,eAAe,GAAG,MAC7B;AAEF;;;;;;;;;;;;;;AAcG;AACU,MAAA,eAAe,GAAG,CAAC,KAAsB,KAAY;IAChE,MAAM,cAAc,GAAG,oDAAoD;IAC3E,IAAI,OAAO,GAAG,cAAc;IAC5B,IAAI,QAAQ,GAAG,EAAE;AAEjB,IAAA,MAAM,aAAa,GAAG,KAAK,EAAE;AAC3B,UAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAY,KAAK,GAAG,YAAYC,kCAA6B;UACzE,IAAI;AACR,IAAA,IAAI,aAAa,YAAYA,kCAA6B,EAAE;QAC1D,QAAQ;YACN,aAAa,CAAC,IAAI,EAAE,SAAS;AAC7B,gBAAA,aAAa,CAAC,SAAS;AACvB,gBAAA,aAAa,CAAC,MAAM;AACpB,gBAAA,EAAE;QACJ,IAAI,mBAAmB,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,mBAAmB,CAAC,QAAQ,CAAC;;AAGzE,IAAA,OAAO,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO;AACzE,IAAA,OAAO,OAAO;AAChB;;ACvEA;;;;AAIG;AACa,SAAA,6BAA6B,CAAC,EAC5C,QAAQ,GAGT,EAAA;AACC,IAAA,MAAM,WAAW,GAAGC,eAAS,EAAE;AAC/B,IAAA,MAAM,WAAW,GAAGF,yBAAc,EAAE;AAEpC,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,oBAAoB,EAAE;IACjD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGG,cAAQ,CAAC,KAAK,CAAC;IACjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAC9C,SAAS,CACV;IAED,MAAM,QAAQ,GAAG,MAAK;QACpB,YAAY,CAAC,IAAI,CAAC;QAClB,eAAe,CAAC,SAAS,CAAC;AAC5B,KAAC;IAED,MAAM,SAAS,GAAG,OAChB,MAA2B,EAC3B,KAAU,EACV,IAAS,KACP;AACF,QAAA,IAAI;AACF,YAAA,IAAI,KAAK;AAAE,gBAAA,MAAM,KAAK;AAEtB,YAAA,IAAI,CAAC,QAAQ,EAAE,wBAAwB,EAAE;;AAEvC,gBAAA,MAAM,SAAS,GAAG,MAAMC,iCAAyB,CAAC,WAAW,EAAE;AAC7D,oBAAA,IAAI,EAAE,MAAO;AACd,iBAAA,CAAC;;AAGF,gBAAA,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU;AACjC,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AACxC,gBAAA,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;AAChC,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;;;YAI1C,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,QAAQ,IAAI,EAAE;YAEnE,IAAI,mBAAmB,EAAE;;gBAEvB,MAAM,WAAW,CAAC,iBAAiB,CAAC;AAClC,oBAAA,SAAS,EAAE,mBAAmB;AAC/B,iBAAA,CAAC;;YAEJ,IAAI,mBAAmB,EAAE;;AAEvB,gBAAA,MAAM,cAAc,CAAC,mBAAmB,CAAC;;;AAI3C,YAAA,QAAQ,EAAE,SAAS,GAAG,MAAO,CAAC;YAC9B,IAAI,QAAQ,EAAE,cAAc;AAAE,gBAAA,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAO,CAAC;AAEpE,YAAA,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE;;;gBAG7B,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;;;AAGhD,YAAA,OAAO,MAAM;;QACb,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC;AAE1C,YAAA,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE;;AAE7B,gBAAA,OAAO,CAAC,KAAK,CACX,CAAA,2DAAA,EAA8D,WAAW,CAAE,CAAA,EAC3E,EAAE,KAAK,EAAE,EACT,EAAE,IAAI,EAAE,CACT;AACD,gBAAA,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;;;YAG1B,eAAe,CAAC,WAAW,CAAC;;AAG5B,YAAA,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC;YAC1B,IAAI,QAAQ,EAAE,YAAY;AAAE,gBAAA,MAAM,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC;;gBACtD;YACR,YAAY,CAAC,KAAK,CAAC;;AAEnB,YAAA,QAAQ,EAAE,SAAS,IAAI;YACvB,IAAI,QAAQ,EAAE,cAAc;AAAE,gBAAA,MAAM,QAAQ,CAAC,cAAc,EAAE;;AAE/D,QAAA,OAAO,SAAS;AAClB,KAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;QACT,SAAS;QACT,YAAY;KACb;AACH;;AC3HA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACG,SAAU,iBAAiB,CAAC,QAAkC,EAAA;AAClE,IAAA,MAAM,YAAY,GAAGC,qBAAe,EAAE;AAEtC,IAAA,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GACpD,6BAA6B,CAAC,EAAE,QAAQ,EAAE,CAAC;;IAG7C,MAAM,UAAU,GAAGC,sBAAgB,CAAC;AAClC,QAAA,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;AAClC,KAAA,CAAC;AAEF,IAAA,eAAe,cAAc,CAC3B,MAAsD,EACtD,iBAAiB,GAAG,KAAK,EAAA;;AAGzB,QAAA,QAAQ,EAAE;AAEV,QAAA,IAAI;;YAEF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;YAEnC,IAAI,CAAC,iBAAiB,EAAE;gBACtB,MAAM,YAAY,EAAE,gBAAgB,CAAC;AACnC,oBAAA,GAAG,MAAM;AACT,oBAAA,IAAI,KAAK,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACpC,iBAAA,CAAC;;AAGJ,YAAA,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC;;QAChC,OAAO,GAAG,EAAE;YACZ,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC;;;IAI3C,OAAO;AACL,QAAA,GAAG,UAAU;QACb,cAAc;QACd,SAAS;QACT,YAAY;KACb;AACH;;AChEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACG,SAAU,mBAAmB,CAAC,QAAmC,EAAA;AACrE,IAAA,MAAM,YAAY,GAAGD,qBAAe,EAAE;IAEtC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GACpD,6BAA6B,CAAC;QAC5B,QAAQ;AACT,KAAA,CAAC;IAEJ,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,EAAE,GAAGE,wBAAkB,CAAC;AACtD,QAAA,QAAQ,EAAE;YACR,QAAQ;YACR,SAAS;AACV,SAAA;AACF,KAAA,CAAC;AAEF;;;;;;;;;;AAUG;AACH,IAAA,eAAe,gBAAgB,CAC7B,MAA6C,EAC7C,gBAAsD,EAAA;AAEtD,QAAA,QAAQ,EAAE;AAEV,QAAA,IAAI;AACF,YAAA,IAAI,MAAM,CAAC,EAAE,IAAI,gBAAgB,EAAE;;gBAEjC,MAAM,YAAY,EAAE,gBAAgB,CAAC;oBACnC,OAAO,EAAE,MAAM,CAAC,EAAE;oBAClB,GAAG,EAAE,gBAAgB,CAAC,GAAG;oBACzB,YAAY,EAAE,gBAAgB,CAAC,YAAY;AAC3C,oBAAA,IAAI,EAAE,gBAAgB,CAAC,IAAI,IAAI,EAAE;oBACjC,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,oBAAA,IAAI,gBAAgB,CAAC,KAAK,IAAI;AAC5B,0BAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK;0BAC/B,EAAE,CAAC;AACR,iBAAA,CAAC;;;AAGJ,YAAA,MAAM,eAAe,CAAC,MAAM,CAAC;;QAC7B,OAAO,GAAG,EAAE;YACZ,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC;;;IAI3C,OAAO;AACL,QAAA,GAAG,IAAI;QACP,SAAS;QACT,YAAY;QACZ,eAAe;QACf,gBAAgB;KACjB;AACH;;AC1FYC;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,eAAA,CAAA,GAAA,eAA+B;AAC/B,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC;AACzC,IAAA,SAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,SAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,SAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AAC3B,CAAC,EANWA,iBAAS,KAATA,iBAAS,GAMpB,EAAA,CAAA,CAAA;AAEY,MAAA,WAAW,GAAG;AACzB,IAAA,aAAa,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,iBAAiB;AACnC,QAAA,IAAI,EAAE,EAAE,SAAS,EAAEA,iBAAS,CAAC,aAAa,EAAW;AACtD,KAAA;AACD,IAAA,iBAAiB,EAAE;AACjB,QAAA,SAAS,EAAE,KAAM;AACjB,QAAA,IAAI,EAAE,EAAE,SAAS,EAAEA,iBAAS,CAAC,kBAAkB,EAAW;AAC3D,KAAA;AACD,IAAA,kBAAkB,EAAE;AAClB,QAAA,SAAS,EAAE,MAAO;AAClB,QAAA,IAAI,EAAE,EAAE,SAAS,EAAEA,iBAAS,CAAC,iBAAiB,EAAW;AAC1D,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;AACzB,QAAA,IAAI,EAAE,EAAE,SAAS,EAAEA,iBAAS,CAAC,UAAU,EAAW;AACnD,KAAA;AACD,IAAA,cAAc,EAAE;AACd,QAAA,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;AACzB,QAAA,IAAI,EAAE,EAAE,SAAS,EAAEA,iBAAS,CAAC,cAAc,EAAW;AACvD,KAAA;;;ACzBH,IAAI,kBAAkB,GAAuB,IAAI;AACjD,IAAI,kBAAkB,GAAQ,IAAI;AAElC;;;;;;;;;;;;;;;;;AAiBG;AACa,SAAA,WAAW,CAAC,WAAwB,EAAE,WAAmB,EAAA;IACvE,kBAAkB,GAAG,WAAW;IAChC,kBAAkB,GAAG,WAAW;AAClC;AAEA;;;;;;;;;;;;;;AAcG;SACa,WAAW,GAAA;AAIzB,IAAA,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,EAAE;AAC9C,QAAA,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC;;IAEpF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE;AAC7E;;AChDgB,SAAA,qBAAqB,CACnC,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE;QAChC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;;AAE/C,IAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE;AAChC,QAAA,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF;;AAEH,IAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;AACrC;;ACVO,eAAe,eAAe,CACnC,KAAc,EACd,OAAgB,EAChB,IAAa,EACb,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;AAED,IAAA,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;QAC7C,GAAGC,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEC,aAAQ;AACb,YAAA,YAAY,EAAE,WAAW;AACzB,YAAA,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,CAAC;QACF,GAAG,WAAW,CAAC,aAAa;AAC7B,KAAA,CAAC;AAEF,IAAA,OAAO,SAAS;AAClB;;MCxBa,yBAAyB,GAAG,CACvC,KAAe,EACf,OAAiB,EACjB,WAAqB,KAClB,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACU,MAAA,uBAAuB,GAAG,CAAC,EACtC,KAAK,EACL,OAAO,GAIR,KAAI;AACH,IAAA,MAAM,MAAM,GAAGR,eAAS,EAAE;AAC1B,IAAA,MAAM,WAAW,GAAGF,yBAAc,EAAE;IACpC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAGW,gBAAU,EAAE;IAE7C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAGC,mBAAQ,CAAC;QACjC,QAAQ,EAAE,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;AAChE,QAAA,OAAO,EAAE,MACP,eAAe,CAAC,KAAM,EAAE,OAAQ,EAAE,WAAY,EAAE,WAAW,EAAE,MAAM,CAAC;AACtE,QAAA,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC;QACnE,GAAG,WAAW,CAAC,iBAAiB;AACjC,KAAA,CAAC;IAEF,OAAO;AACL,QAAA,GAAG,IAAI;QACP,IAAI;QACJ,QAAQ,EAAE,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;KACjE;AACH;;ACxDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;AAEI,MAAM,gBAAgB,GAAG,CAC9B,YAAsB,EACtB,cAAwB,EACxB,MAAe,EACf,UAAoB,KAClB;IACF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGT,cAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IAEvD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,uBAAuB,CAAC;AACzE,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,OAAO,EAAE,cAAc;AACxB,KAAA,CAAC;IAEF,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,GACxD,iBAAiB,CAAC;QAChB,mBAAmB,EAAE,CAAC,WAAW,CAAC;QAClC,SAAS,EAAE,MAAK;YACd,eAAe,CAAC,IAAI,CAAC;SACtB;AACF,KAAA,CAAC;IAEJU,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,aAAa,CAAC,KAAK,CAAC;;AACf,aAAA,IAAI,SAAS,IAAI,SAAS,IAAI,MAAM,EAAE;YAC3C,aAAa,CAAC,IAAI,CAAC;;aACd;YACL,aAAa,CAAC,KAAK,CAAC;;AAExB,KAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEvB,IAAA,MAAM,YAAY,GAAG,YAAW;QAC9B,MAAM,eAAe,GAAG,UAAU,GAAGC,eAAU,GAAG,MAAM;AAExD,QAAA,IAAI;YACF,IAAI,CAAC,cAAc,EAAE;AACnB,gBAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;;YAEjD,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;;AAE/C,YAAA,IAAI,eAAe,IAAI,IAAI,EAAE;AAC3B,gBAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;;AAGlD,YAAA,MAAM,iBAAiB,CAAC;AACtB,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,GAAG,EAAEJ,aAAQ;AACb,gBAAA,YAAY,EAAE,SAAS;AACvB,gBAAA,IAAI,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;AACxC,aAAA,CAAC;;QACF,OAAO,CAAM,EAAE;AACf,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;AAC1C,YAAA,MAAM,CAAC;;AAEX,KAAC;IAED,OAAO;QACL,UAAU;AACV,QAAA,WAAW,EAAE,SAAS;QACtB,YAAY;QACZ,YAAY;KACb;AACH;;AC1Fa,MAAA,YAAY,GAAU;AACjC,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,IAAI,EAAE,UAAU;;AAGX,eAAe,cAAc,CAClC,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,IAAI,KAAK,KAAKK,gBAAW;QAAE,OAAO,YAAY,CAAC,QAAQ;AAEvD,IAAA,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;QAC5C,GAAGN,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEC,aAAQ;AACb,YAAA,YAAY,EAAE,UAAU;SACzB,CAAC;QACF,GAAG,WAAW,CAAC,aAAa;AAC7B,KAAA,CAAC;AAEF,IAAA,OAAO,QAAQ;AACjB;AAEO,eAAe,YAAY,CAChC,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,IAAI,KAAK,KAAKK,gBAAW;QAAE,OAAO,YAAY,CAAC,MAAM;AAErD,IAAA,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;QAC1C,GAAGN,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEC,aAAQ;AACb,YAAA,YAAY,EAAE,QAAQ;SACvB,CAAC;QACF,GAAG,WAAW,CAAC,aAAa;AAC7B,KAAA,CAAC;AAEF,IAAA,OAAO,MAAM;AACf;AAEO,eAAe,UAAU,CAC9B,KAAc,EACd,WAAgB,EAChB,WAAgB,EAAA;IAEhB,IAAI,KAAK,KAAKK,gBAAW;QAAE,OAAO,YAAY,CAAC,IAAI;AAEnD,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;AAED,IAAA,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;QACxC,GAAGN,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEC,aAAQ;AACb,YAAA,YAAY,EAAE,MAAM;SACrB,CAAC;QACF,GAAG,WAAW,CAAC,aAAa;AAC7B,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI;AACb;AAEA;;;;;;;;;;AAUG;AACI,eAAe,WAAW,CAC/B,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACjD,QAAA,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;AAC7C,QAAA,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;AAC/C,QAAA,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;AAC5C,KAAA,CAAC;IACF,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE;AACjC,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;;IAG/C,OAAO;QACL,MAAM;QACN,QAAQ;QACR,IAAI;KACL;AACH;;AClHA;;;;;;;;AAQG;MACU,gBAAgB,GAAG,CAAC,KAAe,KAAY;IAC1D,wBAAwB;IACxB,KAAK;;AAGP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACU,MAAA,SAAS,GAAG,CAAC,KAAe,KAAI;AAC3C,IAAA,MAAM,WAAW,GAAGV,yBAAc,EAAE;AACpC,IAAA,MAAM,MAAM,GAAGE,eAAS,EAAE;IAE1B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAGU,mBAAQ,CAAC;AACjC,QAAA,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACjC,OAAO,EAAE,MAAM,WAAW,CAAC,KAAM,EAAE,WAAW,EAAE,MAAM,CAAC;AACvD,QAAA,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;AACxB,KAAA,CAAC;IAEF,OAAO;AACL,QAAA,GAAG,IAAI;QACP,IAAI;AACJ,QAAA,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;KAClC;AACH;;ACzDO,eAAe,eAAe,CACnC,KAAc,EACd,IAAa,EACb,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;AAED,IAAA,OAAO,MAAM,WAAW,CAAC,UAAU,CAAC;QAClC,GAAGH,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEC,aAAQ;AACb,YAAA,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,IAAI,CAAC;SACb,CAAC;QACF,GAAG,WAAW,CAAC,iBAAiB;AACjC,KAAA,CAAC;AACJ;;ACpBO,eAAe,iBAAiB,CACrC,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;AAED,IAAA,OAAO,MAAM,WAAW,CAAC,UAAU,CAAC;QAClC,GAAGD,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEC,aAAQ;AACb,YAAA,YAAY,EAAE,aAAa;SAC5B,CAAC;QACF,GAAG,WAAW,CAAC,kBAAkB;AAClC,KAAA,CAAC;AACJ;;AChBA;;AAEG;AACI,eAAe,eAAe,CACnC,OAAgB,EAChB,IAAc,EACd,OAAiB,EACjB,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;AAED,IAAA,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,GACzD,MAAM,OAAO,CAAC,GAAG,CAAC;AAChB,QAAA,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAC7C,QAAA,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAC/C,QAAA,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,OAAO,IAAI;AACT,cAAE,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;AAClE,cAAE,SAAS;QACb;cACI,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;AACzD,cAAE,SAAS;AACb,QAAA,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AACrD,KAAA,CAAC;IAEJ,OAAO;QACL,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,SAAS;QACT,SAAS;QACT,KAAK;QACL,OAAO;QACP,IAAI;QACJ,OAAO;KACR;AACH;;AC1CO,eAAe,kBAAkB,CACtC,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAGD,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEO,eAAU;AACf,YAAA,YAAY,EAAE,OAAO;SACtB,CAAC;QACF,GAAG,WAAW,CAAC,aAAa;AAC7B,KAAA,CAAC;AACJ;;ACjBO,eAAe,wBAAwB,CAC5C,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAGP,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEO,eAAU;AACf,YAAA,YAAY,EAAE,aAAa;SAC5B,CAAC;QACF,GAAG,WAAW,CAAC,kBAAkB;AAClC,KAAA,CAAC;AACJ;;ACjBO,eAAe,uBAAuB,CAC3C,KAAc,EACd,MAAe,EACf,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAGP,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEO,eAAU;AACf,YAAA,YAAY,EAAE,YAAY;YAC1B,IAAI,EAAE,CAAC,MAAM,CAAC;SACf,CAAC;QACF,GAAG,WAAW,CAAC,kBAAkB;AAClC,KAAA,CAAC;AACJ;;ACnBO,eAAe,oBAAoB,CACxC,KAAc,EACd,MAAe,EACf,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAGP,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEO,eAAU;AACf,YAAA,YAAY,EAAE,SAAS;YACvB,IAAI,EAAE,CAAC,MAAM,CAAC;SACf,CAAC;QACF,GAAG,WAAW,CAAC,kBAAkB;AAClC,KAAA,CAAC;AACJ;;ACnBO,eAAe,sBAAsB,CAC1C,KAAc,EACd,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAGP,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEO,eAAU;AACf,YAAA,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,KAAK,CAAC;SACd,CAAC;QACF,GAAG,WAAW,CAAC,kBAAkB;AAClC,KAAA,CAAC;AACJ;;ACnBO,eAAe,wBAAwB,CAC5C,KAAc,EACd,KAAc,EACd,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;IACD,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAGP,8BAAwB,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,GAAG,EAAEO,eAAU;AACf,YAAA,YAAY,EAAE,aAAa;YAC3B,IAAI,EAAE,CAAC,KAAK,CAAC;SACd,CAAC;QACF,GAAG,WAAW,CAAC,kBAAkB;AAClC,KAAA,CAAC;AACJ;;ACdA;;AAEG;AACI,eAAe,iBAAiB,CACrC,KAAc,EACd,IAAc,EACd,OAAiB,EACjB,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACnD,WAAW,EACX,WAAW,CACZ;AAED,IAAA,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,GAC5D,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAE/D,QAAA,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;AACnD,QAAA,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;QACzD;cACI,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;AAC/D,cAAE,SAAS;QACb;cACI,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;AAC5D,cAAE,SAAS;QACb;cACI,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;AAC9D,cAAE,SAAS;QACb;cACI,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;AAChE,cAAE,SAAS;AACd,KAAA,CAAC;IAEJ,OAAO;AACL,QAAA,GAAG,SAAS;QACZ,UAAU;QACV,OAAO;QACP,SAAS;QACT,WAAW;QACX,KAAK;AACL,QAAA,KAAK,EAAE,IAAI;QACX,OAAO;KACR;AACH;;AClDA;AACa,MAAA,kBAAkB,GAAG,CAChC,OAA2B,EAC3B,OAA4B,EAC5B,KAAa,KACV,CAAC,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK;AAE/D;AACA,MAAM,oBAAoB,GACxB,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,WAAW;AAE7E;AACA,MAAM,uBAAuB,GAAG,CAAC,OAAe,EAAE,OAAgB,EAAE,KAAa,KAC/E,CAAA,+BAAA,EAAkC,OAAO,CAAI,CAAA,EAAA,OAAO,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,EAAE,CAAA,CAAE;AAE1F;AACA,SAAS,yBAAyB,CAChC,OAAe,EACf,OAAgB,EAChB,KAAa,EAAA;AAEb,IAAA,IAAI,CAAC,oBAAoB;AAAE,QAAA,OAAO,SAAS;AAC3C,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACzF,QAAA,OAAO,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS;;AACpC,IAAA,MAAM;AACN,QAAA,OAAO,SAAS;;AAEpB;AAEA;AACA,SAAS,wBAAwB,CAAC,OAAe,EAAE,OAAgB,EAAE,KAAa,EAAE,KAAa,EAAA;AAC/F,IAAA,IAAI,CAAC,oBAAoB;QAAE;AAC3B,IAAA,IAAI;AACF,QAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;;AAC/F,IAAA,MAAM;;;AAGV;AAEA;;AAEG;AACH,eAAe,UAAU,CACvB,OAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,SAAS,GAAG,IAAI,EAAA;AAEhB,IAAA,MAAM,MAAM,GAAGC,uBAAe,CAAC,WAAW,CAAC;AAC3C,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;AAExD,IAAA,IAAI;AACF,QAAA,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC3D,QAAA,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;;IAC9B,OAAO,GAAQ,EAAE;AACjB,QAAA,MAAM,QAAQ,GACZ,GAAG,YAAYC,0BAAqB;AACpC,YAAA,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAC/B,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;AAEjE,QAAA,IAAI,SAAS,IAAI,QAAQ,EAAE;AACzB,YAAA,OAAO,CAAC,IAAI,CACV,gDAAgD,WAAW,CAAA,yCAAA,CAA2C,CACvG;AACD,YAAA,OAAO,KAAK;;AAGd,QAAA,MAAM,GAAG;;AAEb;AAEA;;;;;;;;;;AAUG;AACH,eAAe,uBAAuB,CACpC,OAAgB,EAChB,WAAmB,EACnB,KAAA,GAAgB,EAAE,EAClB,SAAS,GAAG,IAAI,EAAA;AAEhB,IAAA,MAAM,MAAM,GAAGD,uBAAe,CAAC,WAAW,CAAC;AAC3C,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;AAExD,IAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE;AAC5C,IAAA,IAAI,EAAE,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,EAAE;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,CAAe,YAAA,EAAA,OAAO,CAAoB,iBAAA,EAAA,MAAM,CAAa,UAAA,EAAA,OAAO,CAAG,CAAA,CAAA,CAAC;;;AAI1F,IAAA,IAAI,KAAK,GAAG,EAAE,KAAK,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;;AAG1F,IAAA,IAAI,EAAE,GAAG,KAAK,CAAA;AACd,IAAA,IAAI,EAAE,GAAG,MAAM,CAAA;IACf,IAAI,IAAI,GAAG,EAAE;AAEb,IAAA,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI;AACvB,QAAA,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;AAC5D,YAAA,EAAE,GAAG,KAAK,CAAA;AACV,YAAA,IAAI,KAAK,EAAE,CAAA;;aACN;AACL,YAAA,EAAE,GAAG,KAAK,CAAA;YACV;;;;AAKJ,IAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;QAC/B,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC;YAAE,EAAE,GAAG,GAAG;;YAC/D,EAAE,GAAG,GAAG;;AAEf,IAAA,OAAO,EAAE;AACX;AAEA;;;;;;;;;;;;;;;;AAgBG;AACG,SAAU,+BAA+B,CAC7C,OAAgB,EAChB,QAAgB,EAAE,EAClB,WAAoB,EACpB,OAAkF,EAAA;AAElF,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AACpD,IAAA,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,KAAK;;;;AAKjE,IAAA,MAAM,MAAM,GAAG,WAAW,GAAGA,uBAAe,CAAC,WAAW,CAAC,GAAG,SAAS;IACrE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE;AACrD,IAAA,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS;IAE1D,OAAO;QACL,QAAQ,EAAE,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;QAC1D,OAAO,EAAE,YAAW;AAClB,YAAA,IAAI,CAAC,WAAW;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;AAE9E,YAAUA,uBAAe,CAAC,WAAW;AACrC,YAAA,IAAI,CAAC,YAAY;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;;YAGhE,IAAI,CAAC,mBAAmB,EAAE;gBACxB,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;gBACtE,IAAI,MAAM,KAAK,SAAS;AAAE,oBAAA,OAAO,MAAM;;;AAIzC,YAAA,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAC9C,OAAO,EACP,WAAW,EACX,KAAK,EACL,OAAO,EAAE,SAAS,CACnB;;YAGD,IAAI,CAAC,mBAAmB,EAAE;gBACxB,wBAAwB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC;;AAEpE,YAAA,OAAO,UAAU;SAClB;AACD,QAAA,GAAG,WAAW,CAAC,aAAa;KACpB;AACZ;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;AACI,eAAe,qBAAqB,CACzC,OAAgB,EAChB,KAAgB,GAAA,EAAE,EAClB,OAA6D,EAC7D,WAAyB,EACzB,WAAoB,EAAA;AAEpB,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AACnD,IAAA,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,qBAAqB,CAAC,WAAW,EAAE,WAAW,CAAC;AAEhF,IAAA,MAAM,MAAM,GAAGA,uBAAe,CAAC,WAAW,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE;AACrD,IAAA,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS;AAC1D,IAAA,IAAI,CAAC,YAAY;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAEhE,MAAM,GAAG,GAAG,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;AAC5D,IAAA,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,KAAK;;IAGjE,IAAI,CAAC,mBAAmB,EAAE;QACxB,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;AACtE,QAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,YAAA,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;;;IAIzC,OAAO,WAAW,CAAC,UAAU,CAAC;QAC5B,GAAG,+BAA+B,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC;;AAExE,QAAA,QAAQ,EAAE,GAAG;;QAEb,GAAG,WAAW,CAAC,aAAa;AAC7B,KAAA,CAAC;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
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 = (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): 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(`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))) 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) 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(address, wagmiConfig, floor)\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(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, {\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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"}
|
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
|
|
5
|
+
import { ContractFunctionRevertedError, erc20Abi, maxUint256, zeroAddress, erc4626Abi } from 'viem';
|
|
6
6
|
import { readContractQueryOptions } from 'wagmi/query';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -884,24 +884,12 @@ 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) {
|
|
888
888
|
const client = getPublicClient(wagmiConfig);
|
|
889
889
|
if (!client)
|
|
890
890
|
throw new Error("Public client is missing");
|
|
891
|
-
|
|
892
|
-
|
|
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
|
-
}
|
|
891
|
+
const code = await client.getCode({ address, blockNumber });
|
|
892
|
+
return !!code && code !== "0x";
|
|
905
893
|
}
|
|
906
894
|
/**
|
|
907
895
|
* Internal helper: finds the earliest block where code exists at `address`,
|
|
@@ -914,17 +902,17 @@ async function hasCodeAtX(address, blockNumber, wagmiConfig, allowFail = true) {
|
|
|
914
902
|
* @returns The first block number (bigint) where code is present.
|
|
915
903
|
* @throws If no code exists at the latest block (i.e., contract not deployed).
|
|
916
904
|
*/
|
|
917
|
-
async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n
|
|
905
|
+
async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n) {
|
|
918
906
|
const client = getPublicClient(wagmiConfig);
|
|
919
907
|
if (!client)
|
|
920
908
|
throw new Error("Public client is missing");
|
|
921
909
|
const latest = await client.getBlockNumber();
|
|
922
|
-
if (!(await hasCodeAtX(address, latest, wagmiConfig
|
|
910
|
+
if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
|
|
923
911
|
const chainId = client.chain?.id ?? 0;
|
|
924
912
|
throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`);
|
|
925
913
|
}
|
|
926
914
|
// If caller-supplied floor already has code, it *is* the first code block.
|
|
927
|
-
if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig
|
|
915
|
+
if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig)))
|
|
928
916
|
return floor;
|
|
929
917
|
// Exponential descent to find a "no code" lower bound fast.
|
|
930
918
|
let lo = floor; // known (or assumed) no code
|
|
@@ -932,7 +920,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n, allowFa
|
|
|
932
920
|
let step = 1n;
|
|
933
921
|
while (hi - step > lo) {
|
|
934
922
|
const probe = hi - step;
|
|
935
|
-
if (await hasCodeAtX(address, probe, wagmiConfig
|
|
923
|
+
if (await hasCodeAtX(address, probe, wagmiConfig)) {
|
|
936
924
|
hi = probe; // still has code -> move upper bound down
|
|
937
925
|
step <<= 1n; // double the step
|
|
938
926
|
}
|
|
@@ -944,7 +932,7 @@ async function findDeploymentBlockRpcX(address, wagmiConfig, floor = 0n, allowFa
|
|
|
944
932
|
// Binary search to the first block with code in (lo, hi]
|
|
945
933
|
while (lo + 1n < hi) {
|
|
946
934
|
const mid = lo + (hi - lo) / 2n;
|
|
947
|
-
if (await hasCodeAtX(address, mid, wagmiConfig
|
|
935
|
+
if (await hasCodeAtX(address, mid, wagmiConfig))
|
|
948
936
|
hi = mid;
|
|
949
937
|
else
|
|
950
938
|
lo = mid;
|
|
@@ -993,7 +981,7 @@ function getDeploymentBlockQueryOptionsX(address, floor = 0n, wagmiConfig, optio
|
|
|
993
981
|
return fromLS;
|
|
994
982
|
}
|
|
995
983
|
// Otherwise do the discovery via RPC
|
|
996
|
-
const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor
|
|
984
|
+
const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor);
|
|
997
985
|
// Persist to localStorage for subsequent sessions
|
|
998
986
|
if (!disableLocalStorage) {
|
|
999
987
|
writeDeploymentBlockToLS(finalChainId, address, floor, discovered);
|
|
@@ -1061,7 +1049,9 @@ async function fetchDeploymentBlockX(address, floor = 0n, options, queryClient,
|
|
|
1061
1049
|
}
|
|
1062
1050
|
}
|
|
1063
1051
|
return queryClient.fetchQuery({
|
|
1064
|
-
...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig,
|
|
1052
|
+
...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {
|
|
1053
|
+
disableLocalStorage,
|
|
1054
|
+
}),
|
|
1065
1055
|
// Ensure the final key includes a concrete chainId
|
|
1066
1056
|
queryKey: key,
|
|
1067
1057
|
// Reinstate metadata (in case your ensure/util merges)
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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 { 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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"}
|
|
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 = (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): 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(`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))) 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) 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(address, wagmiConfig, floor)\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(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, {\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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"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Address, Hex } from "viem"
|
|
2
2
|
import type { QueryClient } from "@tanstack/react-query"
|
|
3
3
|
import type { Config } from "wagmi"
|
|
4
4
|
import { getPublicClient } from "wagmi/actions"
|
|
@@ -51,30 +51,12 @@ function writeDeploymentBlockToLS(chainId: bigint, address: Address, floor: bigi
|
|
|
51
51
|
async function hasCodeAtX(
|
|
52
52
|
address: Address,
|
|
53
53
|
blockNumber: bigint,
|
|
54
|
-
wagmiConfig: Config
|
|
55
|
-
allowFail = true
|
|
54
|
+
wagmiConfig: Config
|
|
56
55
|
): Promise<boolean> {
|
|
57
56
|
const client = getPublicClient(wagmiConfig)
|
|
58
57
|
if (!client) throw new Error("Public client is missing")
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
}
|
|
58
|
+
const code: Hex | undefined = await client.getCode({ address, blockNumber })
|
|
59
|
+
return !!code && code !== "0x"
|
|
78
60
|
}
|
|
79
61
|
|
|
80
62
|
/**
|
|
@@ -91,20 +73,19 @@ async function hasCodeAtX(
|
|
|
91
73
|
async function findDeploymentBlockRpcX(
|
|
92
74
|
address: Address,
|
|
93
75
|
wagmiConfig: Config,
|
|
94
|
-
floor: bigint = 0n
|
|
95
|
-
allowFail = true
|
|
76
|
+
floor: bigint = 0n
|
|
96
77
|
): Promise<bigint> {
|
|
97
78
|
const client = getPublicClient(wagmiConfig)
|
|
98
79
|
if (!client) throw new Error("Public client is missing")
|
|
99
80
|
|
|
100
81
|
const latest = await client.getBlockNumber()
|
|
101
|
-
if (!(await hasCodeAtX(address, latest, wagmiConfig
|
|
82
|
+
if (!(await hasCodeAtX(address, latest, wagmiConfig))) {
|
|
102
83
|
const chainId = client.chain?.id ?? 0
|
|
103
84
|
throw new Error(`No code for ${address} at latest block ${latest} on chain ${chainId}.`)
|
|
104
85
|
}
|
|
105
86
|
|
|
106
87
|
// If caller-supplied floor already has code, it *is* the first code block.
|
|
107
|
-
if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig
|
|
88
|
+
if (floor > 0n && (await hasCodeAtX(address, floor, wagmiConfig))) return floor
|
|
108
89
|
|
|
109
90
|
// Exponential descent to find a "no code" lower bound fast.
|
|
110
91
|
let lo = floor // known (or assumed) no code
|
|
@@ -113,7 +94,7 @@ async function findDeploymentBlockRpcX(
|
|
|
113
94
|
|
|
114
95
|
while (hi - step > lo) {
|
|
115
96
|
const probe = hi - step
|
|
116
|
-
if (await hasCodeAtX(address, probe, wagmiConfig
|
|
97
|
+
if (await hasCodeAtX(address, probe, wagmiConfig)) {
|
|
117
98
|
hi = probe // still has code -> move upper bound down
|
|
118
99
|
step <<= 1n // double the step
|
|
119
100
|
} else {
|
|
@@ -125,7 +106,7 @@ async function findDeploymentBlockRpcX(
|
|
|
125
106
|
// Binary search to the first block with code in (lo, hi]
|
|
126
107
|
while (lo + 1n < hi) {
|
|
127
108
|
const mid = lo + (hi - lo) / 2n
|
|
128
|
-
if (await hasCodeAtX(address, mid, wagmiConfig
|
|
109
|
+
if (await hasCodeAtX(address, mid, wagmiConfig)) hi = mid
|
|
129
110
|
else lo = mid
|
|
130
111
|
}
|
|
131
112
|
return hi
|
|
@@ -152,7 +133,7 @@ export function getDeploymentBlockQueryOptionsX(
|
|
|
152
133
|
address: Address,
|
|
153
134
|
floor: bigint = 0n,
|
|
154
135
|
wagmiConfig?: Config,
|
|
155
|
-
options?: { disableLocalStorage?: boolean; chainId?: bigint
|
|
136
|
+
options?: { disableLocalStorage?: boolean; chainId?: bigint }
|
|
156
137
|
) {
|
|
157
138
|
if (!address) throw new Error("Address is required")
|
|
158
139
|
const disableLocalStorage = options?.disableLocalStorage ?? false
|
|
@@ -179,12 +160,7 @@ export function getDeploymentBlockQueryOptionsX(
|
|
|
179
160
|
}
|
|
180
161
|
|
|
181
162
|
// Otherwise do the discovery via RPC
|
|
182
|
-
const discovered = await findDeploymentBlockRpcX(
|
|
183
|
-
address,
|
|
184
|
-
wagmiConfig,
|
|
185
|
-
floor,
|
|
186
|
-
options?.allowFail
|
|
187
|
-
)
|
|
163
|
+
const discovered = await findDeploymentBlockRpcX(address, wagmiConfig, floor)
|
|
188
164
|
|
|
189
165
|
// Persist to localStorage for subsequent sessions
|
|
190
166
|
if (!disableLocalStorage) {
|
|
@@ -243,6 +219,7 @@ export async function fetchDeploymentBlockX(
|
|
|
243
219
|
wagmiConfig?: Config
|
|
244
220
|
): Promise<bigint> {
|
|
245
221
|
if (!address) throw new Error("Address is required")
|
|
222
|
+
|
|
246
223
|
;({ queryClient, wagmiConfig } = ensureClientAndConfig(queryClient, wagmiConfig))
|
|
247
224
|
|
|
248
225
|
const client = getPublicClient(wagmiConfig)
|
|
@@ -262,7 +239,9 @@ export async function fetchDeploymentBlockX(
|
|
|
262
239
|
}
|
|
263
240
|
|
|
264
241
|
return queryClient.fetchQuery({
|
|
265
|
-
...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig,
|
|
242
|
+
...getDeploymentBlockQueryOptionsX(address, floor, wagmiConfig, {
|
|
243
|
+
disableLocalStorage,
|
|
244
|
+
}),
|
|
266
245
|
// Ensure the final key includes a concrete chainId
|
|
267
246
|
queryKey: key,
|
|
268
247
|
// Reinstate metadata (in case your ensure/util merges)
|