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