@aave/react 4.0.0-next.2 → 4.0.0-next.4

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/thirdweb.cjs CHANGED
@@ -1,3 +1,2 @@
1
- 'use strict';var client=require('@aave/client'),types=require('@aave/types'),thirdweb=require('thirdweb'),react=require('thirdweb/react'),h=require('react');require('@aave/core');var actions=require('@aave/client/actions');require('urql');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var h__default=/*#__PURE__*/_interopDefault(h);var T={Idle:()=>({called:false,loading:false,data:void 0,error:void 0}),Loading:e=>({called:true,loading:true,data:e,error:void 0}),Success:e=>({called:true,loading:false,data:e,error:void 0}),Failed:e=>({called:true,loading:false,data:void 0,error:e})};function s(e,t){let[a,r]=h.useState(T.Idle()),n=h.useRef(false),o=h.useCallback(e,t);return [h.useCallback(d=>{types.invariant(!n.current,"Cannot execute a task while another is in progress."),n.current=true,r(({data:i})=>({called:true,loading:true,data:i,error:void 0}));let f=o(d);return f.match(i=>{n.current=false,r(T.Success(i));},i=>{n.current=false,r(T.Failed(i));}),f},[o]),a]}var u=class e{constructor(t){this.wait=t;}static ensure(t){return types.invariant(t instanceof e,"Expected PendingTransaction"),t}};var U=h__default.default.createContext(null);function E(){let e=h.useContext(U);return types.invariant(e,"Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>"),e}function g(){let e=E();return s(t=>actions.permitTypedData(e,t),[e])}function ie(e){let t=react.useActiveAccount(),a=react.useSwitchActiveWalletChain();return s(r=>{types.invariant(t,"No Account found. Ensure you have connected your wallet.");let n=thirdweb.defineChain({id:r.chainId,rpc:`https://${r.chainId}.rpc.thirdweb.com/${e.clientId}`});return types.ResultAsync.fromPromise(a(n),o=>client.UnexpectedError.from(o)).andThen(()=>types.ResultAsync.fromPromise(thirdweb.sendTransaction({account:t,transaction:thirdweb.prepareTransaction({to:r.to,data:r.data,value:BigInt(r.value),chain:n,client:e})}),o=>client.SigningError.from(o))).map(({transactionHash:o})=>new u(()=>types.ResultAsync.fromPromise(thirdweb.waitForReceipt({client:e,chain:n,transactionHash:o}),p=>client.UnexpectedError.from(p)).andThen(({status:p,transactionHash:d})=>p==="reverted"?client.TransactionError.new({txHash:types.txHash(d),request:r}).asResultAsync():types.okAsync({operations:r.operations,txHash:types.txHash(d)}))))},[t,a,e])}function ce(){let[e]=g(),t=react.useActiveAccount();return s(a=>(types.invariant(t,"No Account found. Ensure you have connected your wallet."),e(a).andThen(r=>types.ResultAsync.fromPromise(t.signTypedData({types:r.types,domain:r.domain,primaryType:r.primaryType,message:r.message}),n=>client.SigningError.from(n)).map(n=>({deadline:r.message.deadline,value:types.signatureFrom(n)})))),[t,e])}function pe(){let e=react.useActiveAccount();return s(t=>{types.invariant(e,"Expected an active account to sign swap typed data");let a=JSON.parse(t.message);return types.ResultAsync.fromPromise(e.signTypedData({types:t.types,domain:t.domain,primaryType:t.primaryType,message:a}),r=>client.SigningError.from(r)).map(r=>({deadline:a.deadline,value:types.signatureFrom(r)}))},[e])}
2
- exports.useERC20Permit=ce;exports.useSendTransaction=ie;exports.useSignSwapTypedDataWith=pe;//# sourceMappingURL=thirdweb.cjs.map
1
+ 'use strict';var client=require('@aave/client'),thirdweb=require('@aave/client/thirdweb'),types=require('@aave/types'),thirdweb$1=require('thirdweb'),react=require('thirdweb/react'),h=require('react');require('@aave/core');var actions=require('@aave/client/actions');require('urql');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var h__default=/*#__PURE__*/_interopDefault(h);var T={Idle:()=>({called:false,loading:false,data:void 0,error:void 0}),Loading:e=>({called:true,loading:true,data:e,error:void 0}),Success:e=>({called:true,loading:false,data:e,error:void 0}),Failed:e=>({called:true,loading:false,data:void 0,error:e})};function s(e,t){let[a,r]=h.useState(T.Idle()),n=h.useRef(false),o=h.useCallback(e,t);return [h.useCallback(u=>{types.invariant(!n.current,"Cannot execute a task while another is in progress."),n.current=true,r(({data:i})=>({called:true,loading:true,data:i,error:void 0}));let f=o(u);return f.match(i=>{n.current=false,r(T.Success(i));},i=>{n.current=false,r(T.Failed(i));}),f},[o]),a]}var d=class e{constructor(t){this.wait=t;}static ensure(t){return types.invariant(t instanceof e,"Expected PendingTransaction"),t}};var U=h__default.default.createContext(null);function E(){let e=h.useContext(U);return types.invariant(e,"Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>"),e}function g(){let e=E();return s(t=>actions.permitTypedData(e,t),[e])}function pe(e){let t=react.useActiveAccount(),a=react.useSwitchActiveWalletChain();return s(r=>{types.invariant(t,"No Account found. Ensure you have connected your wallet.");let n=thirdweb.supportedChains[r.chainId]??types.never(`Chain not supported: ${r.chainId}`);return types.ResultAsync.fromPromise(a(n),o=>client.UnexpectedError.from(o)).andThen(()=>types.ResultAsync.fromPromise(thirdweb$1.sendTransaction({account:t,transaction:thirdweb$1.prepareTransaction({to:r.to,data:r.data,value:BigInt(r.value),chain:n,client:e})}),o=>client.SigningError.from(o))).map(({transactionHash:o})=>new d(()=>types.ResultAsync.fromPromise(thirdweb$1.waitForReceipt({client:e,chain:n,transactionHash:o}),p=>client.UnexpectedError.from(p)).andThen(({status:p,transactionHash:u})=>p==="reverted"?client.TransactionError.new({txHash:types.txHash(u),request:r}).asResultAsync():types.okAsync({operations:r.operations,txHash:types.txHash(u)}))))},[t,a,e])}function ue(){let[e]=g(),t=react.useActiveAccount();return s(a=>(types.invariant(t,"No Account found. Ensure you have connected your wallet."),e(a).andThen(r=>types.ResultAsync.fromPromise(t.signTypedData({types:r.types,domain:r.domain,primaryType:r.primaryType,message:r.message}),n=>client.SigningError.from(n)).map(n=>({deadline:r.message.deadline,value:types.signatureFrom(n)})))),[t,e])}function de(){let e=react.useActiveAccount();return s(t=>{types.invariant(e,"Expected an active account to sign swap typed data");let a=JSON.parse(t.message);return types.ResultAsync.fromPromise(e.signTypedData({types:t.types,domain:t.domain,primaryType:t.primaryType,message:a}),r=>client.SigningError.from(r)).map(r=>({deadline:a.deadline,value:types.signatureFrom(r)}))},[e])}exports.useERC20Permit=ue;exports.useSendTransaction=pe;exports.useSignSwapTypedDataWith=de;//# sourceMappingURL=thirdweb.cjs.map
3
2
  //# sourceMappingURL=thirdweb.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/helpers/tasks.ts","../src/helpers/writes.ts","../src/context.tsx","../src/permits.ts","../src/thirdweb.ts"],"names":["AsyncTaskState","data","error","useAsyncTask","handler","deps","state","setState","useState","loadingRef","useRef","handle","useCallback","input","invariant","result","value","PendingTransaction","_PendingTransaction","wait","AaveContext","React","useAaveClient","client","useContext","usePermitTypedDataAction","request","permitTypedData","useSendTransaction","thirdwebClient","account","useActiveAccount","switchChain","useSwitchActiveWalletChain","chain","defineChain","ResultAsync","err","UnexpectedError","sendTransaction","prepareTransaction","SigningError","transactionHash","waitForReceipt","status","TransactionError","txHash","okAsync","useERC20Permit","signature","signatureFrom","useSignSwapTypedDataWith","typedData","message"],"mappings":"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","file":"thirdweb.cjs","sourcesContent":["import { invariant, type ResultAsync } from '@aave/types';\nimport { type DependencyList, useCallback, useRef, useState } from 'react';\n\n/**\n * An async task is a function that can be executed multiple times and that can be in a pending state.\n *\n * @internal\n */\nexport type AsyncTask<TInput, TResult extends ResultAsync<unknown, unknown>> = (\n input: TInput,\n) => TResult;\n\n/**\n * The initial state of a async task.\n */\nexport type AsyncTaskIdle = {\n called: boolean;\n loading: false;\n data: undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task during the loading.\n */\nexport type AsyncTaskLoading<TData> = {\n called: true;\n loading: true;\n data: TData | undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task after a successful call.\n */\nexport type AsyncTaskSuccess<TData> = {\n called: true;\n loading: false;\n data: TData;\n error: undefined;\n};\n\n/**\n * The state of a async task after a failed call.\n */\nexport type AsyncTaskError<TError> = {\n called: true;\n loading: false;\n data: undefined;\n error: TError;\n};\n\n/**\n * The possible statuses of a async task.\n */\nexport type AsyncTaskState<TData, TError> =\n | AsyncTaskIdle\n | AsyncTaskLoading<TData>\n | AsyncTaskSuccess<TData>\n | AsyncTaskError<TError>;\n\nconst AsyncTaskState = {\n Idle: <TData, TError>(): AsyncTaskState<TData, TError> => ({\n called: false,\n loading: false,\n data: undefined,\n error: undefined,\n }),\n Loading: <TData, TError>(data?: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: true,\n data,\n error: undefined,\n }),\n Success: <TData, TError>(data: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data,\n error: undefined,\n }),\n Failed: <TData, TError>(error: TError): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data: undefined,\n error,\n }),\n};\n\n/**\n * A async task React Hook is a lightweight wrapper for an asynchronous function.\n * It allows tracking of the task's execution status and provides access to the\n * last error that occurred during the task's execution, if any.\n *\n * ```ts\n * const [execute, { called, loading, data, error }]: UseAsyncTask<TData, TError, TInput> = useAnyAsyncTask();\n *\n * if (!called) {\n * // data === undefined\n * // error === undefined\n * return <p>Click the button to execute the task</p>;\n * }\n *\n * if (loading) {\n * // data === undefined on first call\n * // data === TData from previous successful call\n * // error === undefined\n * return <Loader />;\n * }\n *\n * if (error) {\n * // data === undefined\n * // error === TError\n * return <p>Something went wrong: {error.message}</p>;\n * }\n *\n * // called === true\n * // data === TData\n * // error === undefined\n * return <p>Task completed: {data}</p>;\n * ```\n */\nexport type UseAsyncTask<TInput, TValue, TError> = [\n AsyncTask<TInput, ResultAsync<TValue, TError>>,\n AsyncTaskState<TValue, TError>,\n];\n\n/**\n * @internal\n */\nexport function useAsyncTask<\n TInput,\n TValue,\n TError,\n TResult extends ResultAsync<TValue, TError>,\n>(\n handler: AsyncTask<TInput, TResult>,\n deps: DependencyList,\n): UseAsyncTask<TInput, TValue, TError> {\n const [state, setState] = useState(AsyncTaskState.Idle<TValue, TError>());\n const loadingRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: useAsyncTask is a low-level hook\n const handle = useCallback(handler, deps);\n\n const execute = useCallback(\n (input: TInput) => {\n invariant(\n !loadingRef.current,\n 'Cannot execute a task while another is in progress.',\n );\n\n loadingRef.current = true;\n setState(({ data }) => {\n return {\n called: true,\n loading: true,\n data,\n error: undefined,\n };\n });\n\n const result = handle(input);\n\n result.match(\n (value) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Success(value));\n },\n (error) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Failed(error));\n },\n );\n\n return result;\n },\n [handle],\n );\n\n return [execute, state];\n}\n","import type { TransactionResult } from '@aave/client';\nimport {\n CancelError,\n type SigningError,\n type TimeoutError,\n type TransactionError,\n type UnexpectedError,\n} from '@aave/core';\nimport type {\n Erc20ApprovalRequired,\n PreContractActionRequired,\n TransactionRequest,\n} from '@aave/graphql';\nimport type { ResultAsync } from '@aave/types';\nimport { invariant } from '@aave/types';\nimport type { UseAsyncTask } from './tasks';\n\n/**\n * The errors that could occur in the early stage of sending a transaction.\n */\nexport type SendTransactionError = CancelError | SigningError | UnexpectedError;\n\nexport type CancelOperation = (\n message: string,\n) => ResultAsync<never, CancelError>;\n\n/**\n * @internal\n */\nexport const cancel: CancelOperation = (message: string) =>\n CancelError.from(message).asResultAsync();\n\nexport type TransactionHandlerOptions = {\n cancel: CancelOperation;\n};\n\n/**\n * The errors that could occur in the late stages of a transaction.\n */\nexport type PendingTransactionError =\n | CancelError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\nexport class PendingTransaction {\n constructor(\n /**\n * @internal Do NOT rely on this method. It's used internally by the SDK and may be subject to breaking changes.\n */\n public readonly wait: () => ResultAsync<\n TransactionResult,\n PendingTransactionError\n >,\n ) {}\n\n /**\n * @internal\n */\n static ensure<T>(value: T): PendingTransaction & T {\n invariant(\n value instanceof PendingTransaction,\n 'Expected PendingTransaction',\n );\n return value as PendingTransaction & T;\n }\n}\n\nexport type UseSendTransactionResult = UseAsyncTask<\n TransactionRequest,\n PendingTransaction,\n SendTransactionError\n>;\n\n/**\n * The handler for sending Aave transactions.\n */\nexport type TransactionHandler = (\n result:\n | TransactionRequest\n | Erc20ApprovalRequired\n | PreContractActionRequired,\n options: TransactionHandlerOptions,\n) => ResultAsync<PendingTransaction, SendTransactionError>;\n","import type { AaveClient } from '@aave/client';\nimport { invariant } from '@aave/types';\nimport React, { type ReactNode, useContext } from 'react';\nimport { Provider as UrqlProvider } from 'urql';\n\nconst AaveContext = React.createContext<AaveClient | null>(null);\n\n/**\n * @internal\n */\nexport type AaveContextProviderProps = {\n children: ReactNode;\n client: AaveClient;\n};\n\n/**\n * @internal\n */\nexport function AaveContextProvider({\n children,\n client,\n}: AaveContextProviderProps) {\n return (\n <AaveContext.Provider value={client}>\n <UrqlProvider value={client.urql}>{children}</UrqlProvider>\n </AaveContext.Provider>\n );\n}\n\n/**\n * @internal\n */\nexport function useAaveClient(): AaveClient {\n const client = useContext(AaveContext);\n\n invariant(\n client,\n 'Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>',\n );\n\n return client;\n}\n","import type { UnexpectedError } from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport type { PermitRequest, PermitTypedDataResponse } from '@aave/graphql';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers';\n\n/**\n * @internal\n */\nexport function usePermitTypedDataAction(): UseAsyncTask<\n PermitRequest,\n PermitTypedDataResponse,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: PermitRequest) => permitTypedData(client, request),\n [client],\n );\n}\n","import { SigningError, TransactionError, UnexpectedError } from '@aave/client';\nimport type {\n CancelSwapTypedData,\n ERC20PermitSignature,\n PermitRequest,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n invariant,\n okAsync,\n ResultAsync,\n signatureFrom,\n txHash,\n} from '@aave/types';\nimport {\n defineChain,\n prepareTransaction,\n sendTransaction,\n type ThirdwebClient,\n waitForReceipt,\n} from 'thirdweb';\nimport { useActiveAccount, useSwitchActiveWalletChain } from 'thirdweb/react';\nimport {\n PendingTransaction,\n type UseAsyncTask,\n type UseSendTransactionResult,\n useAsyncTask,\n} from './helpers';\nimport { usePermitTypedDataAction } from './permits';\n\n/**\n * A hook that provides a way to send Aave transactions using a Thirdweb wallet.\n *\n * Import the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.\n */\nexport function useSendTransaction(\n thirdwebClient: ThirdwebClient,\n): UseSendTransactionResult {\n const account = useActiveAccount();\n const switchChain = useSwitchActiveWalletChain();\n\n return useAsyncTask(\n (request: TransactionRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n const chain = defineChain({\n id: request.chainId,\n rpc: `https://${request.chainId}.rpc.thirdweb.com/${thirdwebClient.clientId}`,\n });\n\n return ResultAsync.fromPromise(switchChain(chain), (err) =>\n UnexpectedError.from(err),\n )\n .andThen(() =>\n ResultAsync.fromPromise(\n sendTransaction({\n account,\n transaction: prepareTransaction({\n to: request.to,\n data: request.data,\n value: BigInt(request.value),\n chain,\n client: thirdwebClient,\n }),\n }),\n (err) => SigningError.from(err),\n ),\n )\n .map(\n ({ transactionHash }) =>\n new PendingTransaction(() =>\n ResultAsync.fromPromise(\n waitForReceipt({\n client: thirdwebClient,\n chain,\n transactionHash,\n }),\n (err) => UnexpectedError.from(err),\n ).andThen(({ status, transactionHash }) => {\n if (status === 'reverted') {\n return TransactionError.new({\n txHash: txHash(transactionHash),\n request,\n }).asResultAsync();\n }\n return okAsync({\n operations: request.operations,\n txHash: txHash(transactionHash),\n });\n }),\n ),\n );\n },\n [account, switchChain, thirdwebClient],\n );\n}\n\nexport type SignERC20PermitError = SigningError | UnexpectedError;\n\n/**\n * A hook that provides a way to sign ERC20 permits using a Thirdweb wallet.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n * const [signERC20Permit, { loading, error, data }] = useERC20Permit();\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * supply: {\n * sender: evmAddress(account.address), // User's address\n * reserve: {\n * reserveId: reserve.id,\n * chainId: reserve.chain.chainId,\n * spoke: reserve.spoke.address,\n * },\n * amount: {\n * value: bigDecimal(42), // 42 USDC\n * },\n * },\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 Permit signature:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(): UseAsyncTask<\n PermitRequest,\n ERC20PermitSignature,\n SignERC20PermitError\n> {\n const [permitTypedData] = usePermitTypedDataAction();\n const account = useActiveAccount();\n\n return useAsyncTask(\n (request: PermitRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n return permitTypedData(request).andThen((result) =>\n ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: result.types as Record<string, unknown>,\n domain: result.domain,\n primaryType: result.primaryType,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => {\n return {\n deadline: result.message.deadline,\n value: signatureFrom(signature),\n };\n }),\n );\n },\n [account, permitTypedData],\n );\n}\n\nexport type SignSwapTypedDataError = SigningError | UnexpectedError;\n\n/**\n * @internal\n * A hook that provides a way to sign swap typed data using a Thirdweb wallet.\n *\n * ```ts\n * const [signSwapTypedData, { loading, error, data }] = useSignSwapTypedDataWith();\n *\n * const run = async () => {\n * const result = await signSwapTypedData(swapTypedData);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Swap typed data signed:', result.value);\n * };\n * ```\n */\nexport function useSignSwapTypedDataWith(): UseAsyncTask<\n SwapByIntentTypedData | CancelSwapTypedData,\n ERC20PermitSignature,\n SignSwapTypedDataError\n> {\n const account = useActiveAccount();\n\n return useAsyncTask(\n (typedData: SwapByIntentTypedData | CancelSwapTypedData) => {\n invariant(account, 'Expected an active account to sign swap typed data');\n\n const message = JSON.parse(typedData.message);\n\n return ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: typedData.types as Record<string, unknown>,\n domain: typedData.domain,\n primaryType: typedData.primaryType,\n message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => ({\n deadline: message.deadline,\n value: signatureFrom(signature),\n }));\n },\n [account],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/helpers/tasks.ts","../src/helpers/writes.ts","../src/context.tsx","../src/permits.ts","../src/thirdweb.ts"],"names":["AsyncTaskState","data","error","useAsyncTask","handler","deps","state","setState","useState","loadingRef","useRef","handle","useCallback","input","invariant","result","value","PendingTransaction","_PendingTransaction","wait","AaveContext","React","useAaveClient","client","useContext","usePermitTypedDataAction","request","permitTypedData","useSendTransaction","thirdwebClient","account","useActiveAccount","switchChain","useSwitchActiveWalletChain","chain","supportedChains","never","ResultAsync","err","UnexpectedError","sendTransaction","prepareTransaction","SigningError","transactionHash","waitForReceipt","status","TransactionError","txHash","okAsync","useERC20Permit","signature","signatureFrom","useSignSwapTypedDataWith","typedData","message"],"mappings":"2YA6DA,IAAMA,CAAAA,CAAiB,CACrB,IAAA,CAAM,KAAqD,CACzD,MAAA,CAAQ,MACR,OAAA,CAAS,KAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,MACT,CAAA,CAAA,CACA,OAAA,CAAyBC,IAAiD,CACxE,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,IAAA,CACT,IAAA,CAAAA,CAAAA,CACA,KAAA,CAAO,MACT,CAAA,CAAA,CACA,OAAA,CAAyBA,CAAAA,GAAgD,CACvE,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,KAAA,CACT,KAAAA,CAAAA,CACA,KAAA,CAAO,MACT,CAAA,CAAA,CACA,MAAA,CAAwBC,CAAAA,GAAkD,CACxE,MAAA,CAAQ,KACR,OAAA,CAAS,KAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAAA,CACF,CAAA,CACF,CAAA,CA2CO,SAASC,CAAAA,CAMdC,CAAAA,CACAC,CAAAA,CACsC,CACtC,GAAM,CAACC,CAAAA,CAAOC,CAAQ,EAAIC,UAAAA,CAASR,CAAAA,CAAe,IAAA,EAAsB,CAAA,CAClES,CAAAA,CAAaC,QAAAA,CAAO,KAAK,EAEzBC,CAAAA,CAASC,aAAAA,CAAYR,CAAAA,CAASC,CAAI,CAAA,CAqCxC,OAAO,CAnCSO,aAAAA,CACbC,GAAkB,CACjBC,eAAAA,CACE,CAACL,CAAAA,CAAW,OAAA,CACZ,qDACF,CAAA,CAEAA,CAAAA,CAAW,QAAU,IAAA,CACrBF,CAAAA,CAAS,CAAC,CAAE,IAAA,CAAAN,CAAK,CAAA,IACR,CACL,OAAQ,IAAA,CACR,OAAA,CAAS,IAAA,CACT,IAAA,CAAAA,CAAAA,CACA,KAAA,CAAO,MACT,CAAA,CACD,EAED,IAAMc,CAAAA,CAASJ,CAAAA,CAAOE,CAAK,CAAA,CAE3B,OAAAE,CAAAA,CAAO,KAAA,CACJC,GAAU,CACTP,CAAAA,CAAW,OAAA,CAAU,KAAA,CACrBF,CAAAA,CAASP,CAAAA,CAAe,OAAA,CAAQgB,CAAK,CAAC,EACxC,CAAA,CACCd,CAAAA,EAAU,CACTO,CAAAA,CAAW,OAAA,CAAU,KAAA,CACrBF,CAAAA,CAASP,EAAe,MAAA,CAAOE,CAAK,CAAC,EACvC,CACF,CAAA,CAEOa,CACT,CAAA,CACA,CAACJ,CAAM,CACT,CAAA,CAEiBL,CAAK,CACxB,CCtIO,IAAMW,CAAAA,CAAN,MAAMC,CAAmB,CAC9B,WAAA,CAIkBC,CAAAA,CAIhB,CAJgB,IAAA,CAAA,IAAA,CAAAA,EAIf,CAKH,OAAO,OAAUH,CAAAA,CAAkC,CACjD,OAAAF,eAAAA,CACEE,CAAAA,YAAiBE,CAAAA,CACjB,6BACF,CAAA,CACOF,CACT,CACF,CAAA,CC7DA,IAAMI,CAAAA,CAAcC,kBAAAA,CAAM,aAAA,CAAiC,IAAI,CAAA,CA2BxD,SAASC,GAA4B,CAC1C,IAAMC,CAAAA,CAASC,YAAAA,CAAWJ,CAAW,CAAA,CAErC,OAAAN,eAAAA,CACES,EACA,kFACF,CAAA,CAEOA,CACT,CChCO,SAASE,CAAAA,EAId,CACA,IAAMF,EAASD,CAAAA,EAAc,CAE7B,OAAOnB,CAAAA,CACJuB,CAAAA,EAA2BC,uBAAAA,CAAgBJ,CAAAA,CAAQG,CAAO,EAC3D,CAACH,CAAM,CACT,CACF,CCiBO,SAASK,EAAAA,CACdC,CAAAA,CAC0B,CAC1B,IAAMC,CAAAA,CAAUC,sBAAAA,EAAiB,CAC3BC,CAAAA,CAAcC,gCAAAA,EAA2B,CAE/C,OAAO9B,EACJuB,CAAAA,EAAgC,CAC/BZ,eAAAA,CACEgB,CAAAA,CACA,0DACF,CAAA,CAEA,IAAMI,CAAAA,CACJC,yBAAgBT,CAAAA,CAAQ,OAAO,CAAA,EAC/BU,WAAAA,CAAM,CAAA,qBAAA,EAAwBV,CAAAA,CAAQ,OAAO,CAAA,CAAE,EAEjD,OAAOW,iBAAAA,CAAY,WAAA,CAAYL,CAAAA,CAAYE,CAAK,CAAA,CAAII,CAAAA,EAClDC,sBAAAA,CAAgB,KAAKD,CAAG,CAC1B,CAAA,CACG,OAAA,CAAQ,IACPD,iBAAAA,CAAY,WAAA,CACVG,0BAAAA,CAAgB,CACd,OAAA,CAAAV,CAAAA,CACA,WAAA,CAAaW,6BAAAA,CAAmB,CAC9B,EAAA,CAAIf,CAAAA,CAAQ,EAAA,CACZ,KAAMA,CAAAA,CAAQ,IAAA,CACd,KAAA,CAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAK,CAAA,CAC3B,KAAA,CAAAQ,EACA,MAAA,CAAQL,CACV,CAAC,CACH,CAAC,CAAA,CACAS,CAAAA,EAAQI,mBAAAA,CAAa,KAAKJ,CAAG,CAChC,CACF,CAAA,CACC,GAAA,CACC,CAAC,CAAE,eAAA,CAAAK,CAAgB,CAAA,GACjB,IAAI1B,CAAAA,CAAmB,IACrBoB,iBAAAA,CAAY,WAAA,CACVO,yBAAAA,CAAe,CACb,OAAQf,CAAAA,CACR,KAAA,CAAAK,CAAAA,CACA,eAAA,CAAAS,CACF,CAAC,CAAA,CACAL,CAAAA,EAAQC,uBAAgB,IAAA,CAAKD,CAAG,CACnC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAE,MAAA,CAAAO,EAAQ,eAAA,CAAAF,CAAgB,CAAA,GAC/BE,CAAAA,GAAW,UAAA,CACNC,uBAAAA,CAAiB,GAAA,CAAI,CAC1B,OAAQC,YAAAA,CAAOJ,CAAe,CAAA,CAC9B,OAAA,CAAAjB,CACF,CAAC,CAAA,CAAE,aAAA,GAEEsB,aAAAA,CAAQ,CACb,UAAA,CAAYtB,CAAAA,CAAQ,UAAA,CACpB,MAAA,CAAQqB,YAAAA,CAAOJ,CAAe,CAChC,CAAC,CACF,CACH,CACJ,CACJ,CAAA,CACA,CAACb,CAAAA,CAASE,EAAaH,CAAc,CACvC,CACF,CAmCO,SAASoB,EAAAA,EAId,CACA,GAAM,CAACtB,CAAe,CAAA,CAAIF,CAAAA,EAAyB,CAC7CK,CAAAA,CAAUC,sBAAAA,EAAiB,CAEjC,OAAO5B,EACJuB,CAAAA,GACCZ,eAAAA,CACEgB,CAAAA,CACA,0DACF,CAAA,CAEOH,CAAAA,CAAgBD,CAAO,CAAA,CAAE,QAASX,CAAAA,EACvCsB,iBAAAA,CAAY,WAAA,CACVP,CAAAA,CAAQ,aAAA,CAAc,CAEpB,KAAA,CAAOf,CAAAA,CAAO,MACd,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,WAAA,CAAaA,CAAAA,CAAO,WAAA,CACpB,OAAA,CAASA,CAAAA,CAAO,OAClB,CAAC,CAAA,CACAuB,CAAAA,EAAQI,mBAAAA,CAAa,IAAA,CAAKJ,CAAG,CAChC,CAAA,CAAE,IAAKY,CAAAA,GACE,CACL,QAAA,CAAUnC,CAAAA,CAAO,OAAA,CAAQ,QAAA,CACzB,KAAA,CAAOoC,mBAAAA,CAAcD,CAAS,CAChC,CAAA,CACD,CACH,CAAA,CAAA,CAEF,CAACpB,CAAAA,CAASH,CAAe,CAC3B,CACF,CAuBO,SAASyB,EAAAA,EAId,CACA,IAAMtB,CAAAA,CAAUC,sBAAAA,EAAiB,CAEjC,OAAO5B,CAAAA,CACJkD,CAAAA,EAA2D,CAC1DvC,eAAAA,CAAUgB,CAAAA,CAAS,oDAAoD,CAAA,CAEvE,IAAMwB,EAAU,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAU,OAAO,CAAA,CAE5C,OAAOhB,iBAAAA,CAAY,WAAA,CACjBP,EAAQ,aAAA,CAAc,CAEpB,KAAA,CAAOuB,CAAAA,CAAU,KAAA,CACjB,MAAA,CAAQA,CAAAA,CAAU,MAAA,CAClB,YAAaA,CAAAA,CAAU,WAAA,CACvB,OAAA,CAAAC,CACF,CAAC,CAAA,CACAhB,CAAAA,EAAQI,mBAAAA,CAAa,KAAKJ,CAAG,CAChC,CAAA,CAAE,GAAA,CAAKY,CAAAA,GAAe,CACpB,QAAA,CAAUI,CAAAA,CAAQ,SAClB,KAAA,CAAOH,mBAAAA,CAAcD,CAAS,CAChC,EAAE,CACJ,CAAA,CACA,CAACpB,CAAO,CACV,CACF","file":"thirdweb.cjs","sourcesContent":["import { invariant, type ResultAsync } from '@aave/types';\nimport { type DependencyList, useCallback, useRef, useState } from 'react';\n\n/**\n * An async task is a function that can be executed multiple times and that can be in a pending state.\n *\n * @internal\n */\nexport type AsyncTask<TInput, TResult extends ResultAsync<unknown, unknown>> = (\n input: TInput,\n) => TResult;\n\n/**\n * The initial state of a async task.\n */\nexport type AsyncTaskIdle = {\n called: boolean;\n loading: false;\n data: undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task during the loading.\n */\nexport type AsyncTaskLoading<TData> = {\n called: true;\n loading: true;\n data: TData | undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task after a successful call.\n */\nexport type AsyncTaskSuccess<TData> = {\n called: true;\n loading: false;\n data: TData;\n error: undefined;\n};\n\n/**\n * The state of a async task after a failed call.\n */\nexport type AsyncTaskError<TError> = {\n called: true;\n loading: false;\n data: undefined;\n error: TError;\n};\n\n/**\n * The possible statuses of a async task.\n */\nexport type AsyncTaskState<TData, TError> =\n | AsyncTaskIdle\n | AsyncTaskLoading<TData>\n | AsyncTaskSuccess<TData>\n | AsyncTaskError<TError>;\n\nconst AsyncTaskState = {\n Idle: <TData, TError>(): AsyncTaskState<TData, TError> => ({\n called: false,\n loading: false,\n data: undefined,\n error: undefined,\n }),\n Loading: <TData, TError>(data?: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: true,\n data,\n error: undefined,\n }),\n Success: <TData, TError>(data: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data,\n error: undefined,\n }),\n Failed: <TData, TError>(error: TError): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data: undefined,\n error,\n }),\n};\n\n/**\n * A async task React Hook is a lightweight wrapper for an asynchronous function.\n * It allows tracking of the task's execution status and provides access to the\n * last error that occurred during the task's execution, if any.\n *\n * ```ts\n * const [execute, { called, loading, data, error }]: UseAsyncTask<TData, TError, TInput> = useAnyAsyncTask();\n *\n * if (!called) {\n * // data === undefined\n * // error === undefined\n * return <p>Click the button to execute the task</p>;\n * }\n *\n * if (loading) {\n * // data === undefined on first call\n * // data === TData from previous successful call\n * // error === undefined\n * return <Loader />;\n * }\n *\n * if (error) {\n * // data === undefined\n * // error === TError\n * return <p>Something went wrong: {error.message}</p>;\n * }\n *\n * // called === true\n * // data === TData\n * // error === undefined\n * return <p>Task completed: {data}</p>;\n * ```\n */\nexport type UseAsyncTask<TInput, TValue, TError> = [\n AsyncTask<TInput, ResultAsync<TValue, TError>>,\n AsyncTaskState<TValue, TError>,\n];\n\n/**\n * @internal\n */\nexport function useAsyncTask<\n TInput,\n TValue,\n TError,\n TResult extends ResultAsync<TValue, TError>,\n>(\n handler: AsyncTask<TInput, TResult>,\n deps: DependencyList,\n): UseAsyncTask<TInput, TValue, TError> {\n const [state, setState] = useState(AsyncTaskState.Idle<TValue, TError>());\n const loadingRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: useAsyncTask is a low-level hook\n const handle = useCallback(handler, deps);\n\n const execute = useCallback(\n (input: TInput) => {\n invariant(\n !loadingRef.current,\n 'Cannot execute a task while another is in progress.',\n );\n\n loadingRef.current = true;\n setState(({ data }) => {\n return {\n called: true,\n loading: true,\n data,\n error: undefined,\n };\n });\n\n const result = handle(input);\n\n result.match(\n (value) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Success(value));\n },\n (error) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Failed(error));\n },\n );\n\n return result;\n },\n [handle],\n );\n\n return [execute, state];\n}\n","import type { TransactionResult } from '@aave/client';\nimport {\n CancelError,\n type SigningError,\n type TimeoutError,\n type TransactionError,\n type UnexpectedError,\n} from '@aave/core';\nimport type {\n Erc20ApprovalRequired,\n PreContractActionRequired,\n TransactionRequest,\n} from '@aave/graphql';\nimport type { ResultAsync } from '@aave/types';\nimport { invariant } from '@aave/types';\nimport type { UseAsyncTask } from './tasks';\n\n/**\n * The errors that could occur in the early stage of sending a transaction.\n */\nexport type SendTransactionError = CancelError | SigningError | UnexpectedError;\n\nexport type CancelOperation = (\n message: string,\n) => ResultAsync<never, CancelError>;\n\n/**\n * @internal\n */\nexport const cancel: CancelOperation = (message: string) =>\n CancelError.from(message).asResultAsync();\n\nexport type TransactionHandlerOptions = {\n cancel: CancelOperation;\n};\n\n/**\n * The errors that could occur in the late stages of a transaction.\n */\nexport type PendingTransactionError =\n | CancelError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\nexport class PendingTransaction {\n constructor(\n /**\n * @internal Do NOT rely on this method. It's used internally by the SDK and may be subject to breaking changes.\n */\n public readonly wait: () => ResultAsync<\n TransactionResult,\n PendingTransactionError\n >,\n ) {}\n\n /**\n * @internal\n */\n static ensure<T>(value: T): PendingTransaction & T {\n invariant(\n value instanceof PendingTransaction,\n 'Expected PendingTransaction',\n );\n return value as PendingTransaction & T;\n }\n}\n\nexport type UseSendTransactionResult = UseAsyncTask<\n TransactionRequest,\n PendingTransaction,\n SendTransactionError\n>;\n\n/**\n * The handler for sending Aave transactions.\n */\nexport type TransactionHandler = (\n result:\n | TransactionRequest\n | Erc20ApprovalRequired\n | PreContractActionRequired,\n options: TransactionHandlerOptions,\n) => ResultAsync<PendingTransaction, SendTransactionError>;\n","import type { AaveClient } from '@aave/client';\nimport { invariant } from '@aave/types';\nimport React, { type ReactNode, useContext } from 'react';\nimport { Provider as UrqlProvider } from 'urql';\n\nconst AaveContext = React.createContext<AaveClient | null>(null);\n\n/**\n * @internal\n */\nexport type AaveContextProviderProps = {\n children: ReactNode;\n client: AaveClient;\n};\n\n/**\n * @internal\n */\nexport function AaveContextProvider({\n children,\n client,\n}: AaveContextProviderProps) {\n return (\n <AaveContext.Provider value={client}>\n <UrqlProvider value={client.urql}>{children}</UrqlProvider>\n </AaveContext.Provider>\n );\n}\n\n/**\n * @internal\n */\nexport function useAaveClient(): AaveClient {\n const client = useContext(AaveContext);\n\n invariant(\n client,\n 'Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>',\n );\n\n return client;\n}\n","import type { UnexpectedError } from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport type { PermitRequest, PermitTypedDataResponse } from '@aave/graphql';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers';\n\n/**\n * @internal\n */\nexport function usePermitTypedDataAction(): UseAsyncTask<\n PermitRequest,\n PermitTypedDataResponse,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: PermitRequest) => permitTypedData(client, request),\n [client],\n );\n}\n","import { SigningError, TransactionError, UnexpectedError } from '@aave/client';\nimport { supportedChains } from '@aave/client/thirdweb';\nimport type {\n CancelSwapTypedData,\n ERC20PermitSignature,\n PermitRequest,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n invariant,\n never,\n okAsync,\n ResultAsync,\n signatureFrom,\n txHash,\n} from '@aave/types';\nimport {\n prepareTransaction,\n sendTransaction,\n type ThirdwebClient,\n waitForReceipt,\n} from 'thirdweb';\nimport { useActiveAccount, useSwitchActiveWalletChain } from 'thirdweb/react';\nimport {\n PendingTransaction,\n type UseAsyncTask,\n type UseSendTransactionResult,\n useAsyncTask,\n} from './helpers';\nimport { usePermitTypedDataAction } from './permits';\n\n/**\n * A hook that provides a way to send Aave transactions using a Thirdweb wallet.\n *\n * Import the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.\n */\nexport function useSendTransaction(\n thirdwebClient: ThirdwebClient,\n): UseSendTransactionResult {\n const account = useActiveAccount();\n const switchChain = useSwitchActiveWalletChain();\n\n return useAsyncTask(\n (request: TransactionRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n const chain =\n supportedChains[request.chainId] ??\n never(`Chain not supported: ${request.chainId}`);\n\n return ResultAsync.fromPromise(switchChain(chain), (err) =>\n UnexpectedError.from(err),\n )\n .andThen(() =>\n ResultAsync.fromPromise(\n sendTransaction({\n account,\n transaction: prepareTransaction({\n to: request.to,\n data: request.data,\n value: BigInt(request.value),\n chain,\n client: thirdwebClient,\n }),\n }),\n (err) => SigningError.from(err),\n ),\n )\n .map(\n ({ transactionHash }) =>\n new PendingTransaction(() =>\n ResultAsync.fromPromise(\n waitForReceipt({\n client: thirdwebClient,\n chain,\n transactionHash,\n }),\n (err) => UnexpectedError.from(err),\n ).andThen(({ status, transactionHash }) => {\n if (status === 'reverted') {\n return TransactionError.new({\n txHash: txHash(transactionHash),\n request,\n }).asResultAsync();\n }\n return okAsync({\n operations: request.operations,\n txHash: txHash(transactionHash),\n });\n }),\n ),\n );\n },\n [account, switchChain, thirdwebClient],\n );\n}\n\nexport type SignERC20PermitError = SigningError | UnexpectedError;\n\n/**\n * A hook that provides a way to sign ERC20 permits using a Thirdweb wallet.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n * const [signERC20Permit, { loading, error, data }] = useERC20Permit();\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * supply: {\n * sender: evmAddress(account.address), // User's address\n * reserve: {\n * reserveId: reserve.id,\n * chainId: reserve.chain.chainId,\n * spoke: reserve.spoke.address,\n * },\n * amount: {\n * value: bigDecimal(42), // 42 USDC\n * },\n * },\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 Permit signature:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(): UseAsyncTask<\n PermitRequest,\n ERC20PermitSignature,\n SignERC20PermitError\n> {\n const [permitTypedData] = usePermitTypedDataAction();\n const account = useActiveAccount();\n\n return useAsyncTask(\n (request: PermitRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n return permitTypedData(request).andThen((result) =>\n ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: result.types as Record<string, unknown>,\n domain: result.domain,\n primaryType: result.primaryType,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => {\n return {\n deadline: result.message.deadline,\n value: signatureFrom(signature),\n };\n }),\n );\n },\n [account, permitTypedData],\n );\n}\n\nexport type SignSwapTypedDataError = SigningError | UnexpectedError;\n\n/**\n * @internal\n * A hook that provides a way to sign swap typed data using a Thirdweb wallet.\n *\n * ```ts\n * const [signSwapTypedData, { loading, error, data }] = useSignSwapTypedDataWith();\n *\n * const run = async () => {\n * const result = await signSwapTypedData(swapTypedData);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Swap typed data signed:', result.value);\n * };\n * ```\n */\nexport function useSignSwapTypedDataWith(): UseAsyncTask<\n SwapByIntentTypedData | CancelSwapTypedData,\n ERC20PermitSignature,\n SignSwapTypedDataError\n> {\n const account = useActiveAccount();\n\n return useAsyncTask(\n (typedData: SwapByIntentTypedData | CancelSwapTypedData) => {\n invariant(account, 'Expected an active account to sign swap typed data');\n\n const message = JSON.parse(typedData.message);\n\n return ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: typedData.types as Record<string, unknown>,\n domain: typedData.domain,\n primaryType: typedData.primaryType,\n message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => ({\n deadline: message.deadline,\n value: signatureFrom(signature),\n }));\n },\n [account],\n );\n}\n"]}
package/dist/thirdweb.js CHANGED
@@ -1,3 +1,2 @@
1
- import {a,c,f}from'./chunk-GTUQRT5Q.js';import {UnexpectedError,SigningError,TransactionError}from'@aave/client';import {invariant,ResultAsync,okAsync,txHash,signatureFrom}from'@aave/types';import {defineChain,sendTransaction,prepareTransaction,waitForReceipt}from'thirdweb';import {useActiveAccount,useSwitchActiveWalletChain}from'thirdweb/react';function I(r){let n=useActiveAccount(),a$1=useSwitchActiveWalletChain();return a(e=>{invariant(n,"No Account found. Ensure you have connected your wallet.");let t=defineChain({id:e.chainId,rpc:`https://${e.chainId}.rpc.thirdweb.com/${r.clientId}`});return ResultAsync.fromPromise(a$1(t),o=>UnexpectedError.from(o)).andThen(()=>ResultAsync.fromPromise(sendTransaction({account:n,transaction:prepareTransaction({to:e.to,data:e.data,value:BigInt(e.value),chain:t,client:r})}),o=>SigningError.from(o))).map(({transactionHash:o})=>new c(()=>ResultAsync.fromPromise(waitForReceipt({client:r,chain:t,transactionHash:o}),c=>UnexpectedError.from(c)).andThen(({status:c,transactionHash:u})=>c==="reverted"?TransactionError.new({txHash:txHash(u),request:e}).asResultAsync():okAsync({operations:e.operations,txHash:txHash(u)}))))},[n,a$1,r])}function B(){let[r]=f(),n=useActiveAccount();return a(a=>(invariant(n,"No Account found. Ensure you have connected your wallet."),r(a).andThen(e=>ResultAsync.fromPromise(n.signTypedData({types:e.types,domain:e.domain,primaryType:e.primaryType,message:e.message}),t=>SigningError.from(t)).map(t=>({deadline:e.message.deadline,value:signatureFrom(t)})))),[n,r])}function N(){let r=useActiveAccount();return a(n=>{invariant(r,"Expected an active account to sign swap typed data");let a=JSON.parse(n.message);return ResultAsync.fromPromise(r.signTypedData({types:n.types,domain:n.domain,primaryType:n.primaryType,message:a}),e=>SigningError.from(e)).map(e=>({deadline:a.deadline,value:signatureFrom(e)}))},[r])}
2
- export{B as useERC20Permit,I as useSendTransaction,N as useSignSwapTypedDataWith};//# sourceMappingURL=thirdweb.js.map
1
+ import {a,c,f}from'./chunk-GTUQRT5Q.js';import {UnexpectedError,SigningError,TransactionError}from'@aave/client';import {supportedChains}from'@aave/client/thirdweb';import {invariant,never,ResultAsync,okAsync,txHash,signatureFrom}from'@aave/types';import {sendTransaction,prepareTransaction,waitForReceipt}from'thirdweb';import {useActiveAccount,useSwitchActiveWalletChain}from'thirdweb/react';function N(r){let n=useActiveAccount(),a$1=useSwitchActiveWalletChain();return a(e=>{invariant(n,"No Account found. Ensure you have connected your wallet.");let t=supportedChains[e.chainId]??never(`Chain not supported: ${e.chainId}`);return ResultAsync.fromPromise(a$1(t),o=>UnexpectedError.from(o)).andThen(()=>ResultAsync.fromPromise(sendTransaction({account:n,transaction:prepareTransaction({to:e.to,data:e.data,value:BigInt(e.value),chain:t,client:r})}),o=>SigningError.from(o))).map(({transactionHash:o})=>new c(()=>ResultAsync.fromPromise(waitForReceipt({client:r,chain:t,transactionHash:o}),p=>UnexpectedError.from(p)).andThen(({status:p,transactionHash:u})=>p==="reverted"?TransactionError.new({txHash:txHash(u),request:e}).asResultAsync():okAsync({operations:e.operations,txHash:txHash(u)}))))},[n,a$1,r])}function F(){let[r]=f(),n=useActiveAccount();return a(a=>(invariant(n,"No Account found. Ensure you have connected your wallet."),r(a).andThen(e=>ResultAsync.fromPromise(n.signTypedData({types:e.types,domain:e.domain,primaryType:e.primaryType,message:e.message}),t=>SigningError.from(t)).map(t=>({deadline:e.message.deadline,value:signatureFrom(t)})))),[n,r])}function H(){let r=useActiveAccount();return a(n=>{invariant(r,"Expected an active account to sign swap typed data");let a=JSON.parse(n.message);return ResultAsync.fromPromise(r.signTypedData({types:n.types,domain:n.domain,primaryType:n.primaryType,message:a}),e=>SigningError.from(e)).map(e=>({deadline:a.deadline,value:signatureFrom(e)}))},[r])}export{F as useERC20Permit,N as useSendTransaction,H as useSignSwapTypedDataWith};//# sourceMappingURL=thirdweb.js.map
3
2
  //# sourceMappingURL=thirdweb.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/thirdweb.ts"],"names":["useSendTransaction","thirdwebClient","account","useActiveAccount","switchChain","useSwitchActiveWalletChain","useAsyncTask","request","invariant","chain","defineChain","ResultAsync","err","UnexpectedError","sendTransaction","prepareTransaction","SigningError","transactionHash","PendingTransaction","waitForReceipt","status","TransactionError","txHash","okAsync","useERC20Permit","permitTypedData","usePermitTypedDataAction","result","signature","signatureFrom","useSignSwapTypedDataWith","typedData","message"],"mappings":"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","file":"thirdweb.js","sourcesContent":["import { SigningError, TransactionError, UnexpectedError } from '@aave/client';\nimport type {\n CancelSwapTypedData,\n ERC20PermitSignature,\n PermitRequest,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n invariant,\n okAsync,\n ResultAsync,\n signatureFrom,\n txHash,\n} from '@aave/types';\nimport {\n defineChain,\n prepareTransaction,\n sendTransaction,\n type ThirdwebClient,\n waitForReceipt,\n} from 'thirdweb';\nimport { useActiveAccount, useSwitchActiveWalletChain } from 'thirdweb/react';\nimport {\n PendingTransaction,\n type UseAsyncTask,\n type UseSendTransactionResult,\n useAsyncTask,\n} from './helpers';\nimport { usePermitTypedDataAction } from './permits';\n\n/**\n * A hook that provides a way to send Aave transactions using a Thirdweb wallet.\n *\n * Import the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.\n */\nexport function useSendTransaction(\n thirdwebClient: ThirdwebClient,\n): UseSendTransactionResult {\n const account = useActiveAccount();\n const switchChain = useSwitchActiveWalletChain();\n\n return useAsyncTask(\n (request: TransactionRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n const chain = defineChain({\n id: request.chainId,\n rpc: `https://${request.chainId}.rpc.thirdweb.com/${thirdwebClient.clientId}`,\n });\n\n return ResultAsync.fromPromise(switchChain(chain), (err) =>\n UnexpectedError.from(err),\n )\n .andThen(() =>\n ResultAsync.fromPromise(\n sendTransaction({\n account,\n transaction: prepareTransaction({\n to: request.to,\n data: request.data,\n value: BigInt(request.value),\n chain,\n client: thirdwebClient,\n }),\n }),\n (err) => SigningError.from(err),\n ),\n )\n .map(\n ({ transactionHash }) =>\n new PendingTransaction(() =>\n ResultAsync.fromPromise(\n waitForReceipt({\n client: thirdwebClient,\n chain,\n transactionHash,\n }),\n (err) => UnexpectedError.from(err),\n ).andThen(({ status, transactionHash }) => {\n if (status === 'reverted') {\n return TransactionError.new({\n txHash: txHash(transactionHash),\n request,\n }).asResultAsync();\n }\n return okAsync({\n operations: request.operations,\n txHash: txHash(transactionHash),\n });\n }),\n ),\n );\n },\n [account, switchChain, thirdwebClient],\n );\n}\n\nexport type SignERC20PermitError = SigningError | UnexpectedError;\n\n/**\n * A hook that provides a way to sign ERC20 permits using a Thirdweb wallet.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n * const [signERC20Permit, { loading, error, data }] = useERC20Permit();\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * supply: {\n * sender: evmAddress(account.address), // User's address\n * reserve: {\n * reserveId: reserve.id,\n * chainId: reserve.chain.chainId,\n * spoke: reserve.spoke.address,\n * },\n * amount: {\n * value: bigDecimal(42), // 42 USDC\n * },\n * },\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 Permit signature:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(): UseAsyncTask<\n PermitRequest,\n ERC20PermitSignature,\n SignERC20PermitError\n> {\n const [permitTypedData] = usePermitTypedDataAction();\n const account = useActiveAccount();\n\n return useAsyncTask(\n (request: PermitRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n return permitTypedData(request).andThen((result) =>\n ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: result.types as Record<string, unknown>,\n domain: result.domain,\n primaryType: result.primaryType,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => {\n return {\n deadline: result.message.deadline,\n value: signatureFrom(signature),\n };\n }),\n );\n },\n [account, permitTypedData],\n );\n}\n\nexport type SignSwapTypedDataError = SigningError | UnexpectedError;\n\n/**\n * @internal\n * A hook that provides a way to sign swap typed data using a Thirdweb wallet.\n *\n * ```ts\n * const [signSwapTypedData, { loading, error, data }] = useSignSwapTypedDataWith();\n *\n * const run = async () => {\n * const result = await signSwapTypedData(swapTypedData);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Swap typed data signed:', result.value);\n * };\n * ```\n */\nexport function useSignSwapTypedDataWith(): UseAsyncTask<\n SwapByIntentTypedData | CancelSwapTypedData,\n ERC20PermitSignature,\n SignSwapTypedDataError\n> {\n const account = useActiveAccount();\n\n return useAsyncTask(\n (typedData: SwapByIntentTypedData | CancelSwapTypedData) => {\n invariant(account, 'Expected an active account to sign swap typed data');\n\n const message = JSON.parse(typedData.message);\n\n return ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: typedData.types as Record<string, unknown>,\n domain: typedData.domain,\n primaryType: typedData.primaryType,\n message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => ({\n deadline: message.deadline,\n value: signatureFrom(signature),\n }));\n },\n [account],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/thirdweb.ts"],"names":["useSendTransaction","thirdwebClient","account","useActiveAccount","switchChain","useSwitchActiveWalletChain","useAsyncTask","request","invariant","chain","supportedChains","never","ResultAsync","err","UnexpectedError","sendTransaction","prepareTransaction","SigningError","transactionHash","PendingTransaction","waitForReceipt","status","TransactionError","txHash","okAsync","useERC20Permit","permitTypedData","usePermitTypedDataAction","result","signature","signatureFrom","useSignSwapTypedDataWith","typedData","message"],"mappings":"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","file":"thirdweb.js","sourcesContent":["import { SigningError, TransactionError, UnexpectedError } from '@aave/client';\nimport { supportedChains } from '@aave/client/thirdweb';\nimport type {\n CancelSwapTypedData,\n ERC20PermitSignature,\n PermitRequest,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n invariant,\n never,\n okAsync,\n ResultAsync,\n signatureFrom,\n txHash,\n} from '@aave/types';\nimport {\n prepareTransaction,\n sendTransaction,\n type ThirdwebClient,\n waitForReceipt,\n} from 'thirdweb';\nimport { useActiveAccount, useSwitchActiveWalletChain } from 'thirdweb/react';\nimport {\n PendingTransaction,\n type UseAsyncTask,\n type UseSendTransactionResult,\n useAsyncTask,\n} from './helpers';\nimport { usePermitTypedDataAction } from './permits';\n\n/**\n * A hook that provides a way to send Aave transactions using a Thirdweb wallet.\n *\n * Import the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.\n */\nexport function useSendTransaction(\n thirdwebClient: ThirdwebClient,\n): UseSendTransactionResult {\n const account = useActiveAccount();\n const switchChain = useSwitchActiveWalletChain();\n\n return useAsyncTask(\n (request: TransactionRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n const chain =\n supportedChains[request.chainId] ??\n never(`Chain not supported: ${request.chainId}`);\n\n return ResultAsync.fromPromise(switchChain(chain), (err) =>\n UnexpectedError.from(err),\n )\n .andThen(() =>\n ResultAsync.fromPromise(\n sendTransaction({\n account,\n transaction: prepareTransaction({\n to: request.to,\n data: request.data,\n value: BigInt(request.value),\n chain,\n client: thirdwebClient,\n }),\n }),\n (err) => SigningError.from(err),\n ),\n )\n .map(\n ({ transactionHash }) =>\n new PendingTransaction(() =>\n ResultAsync.fromPromise(\n waitForReceipt({\n client: thirdwebClient,\n chain,\n transactionHash,\n }),\n (err) => UnexpectedError.from(err),\n ).andThen(({ status, transactionHash }) => {\n if (status === 'reverted') {\n return TransactionError.new({\n txHash: txHash(transactionHash),\n request,\n }).asResultAsync();\n }\n return okAsync({\n operations: request.operations,\n txHash: txHash(transactionHash),\n });\n }),\n ),\n );\n },\n [account, switchChain, thirdwebClient],\n );\n}\n\nexport type SignERC20PermitError = SigningError | UnexpectedError;\n\n/**\n * A hook that provides a way to sign ERC20 permits using a Thirdweb wallet.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n * const [signERC20Permit, { loading, error, data }] = useERC20Permit();\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * supply: {\n * sender: evmAddress(account.address), // User's address\n * reserve: {\n * reserveId: reserve.id,\n * chainId: reserve.chain.chainId,\n * spoke: reserve.spoke.address,\n * },\n * amount: {\n * value: bigDecimal(42), // 42 USDC\n * },\n * },\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 Permit signature:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(): UseAsyncTask<\n PermitRequest,\n ERC20PermitSignature,\n SignERC20PermitError\n> {\n const [permitTypedData] = usePermitTypedDataAction();\n const account = useActiveAccount();\n\n return useAsyncTask(\n (request: PermitRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n return permitTypedData(request).andThen((result) =>\n ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: result.types as Record<string, unknown>,\n domain: result.domain,\n primaryType: result.primaryType,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => {\n return {\n deadline: result.message.deadline,\n value: signatureFrom(signature),\n };\n }),\n );\n },\n [account, permitTypedData],\n );\n}\n\nexport type SignSwapTypedDataError = SigningError | UnexpectedError;\n\n/**\n * @internal\n * A hook that provides a way to sign swap typed data using a Thirdweb wallet.\n *\n * ```ts\n * const [signSwapTypedData, { loading, error, data }] = useSignSwapTypedDataWith();\n *\n * const run = async () => {\n * const result = await signSwapTypedData(swapTypedData);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Swap typed data signed:', result.value);\n * };\n * ```\n */\nexport function useSignSwapTypedDataWith(): UseAsyncTask<\n SwapByIntentTypedData | CancelSwapTypedData,\n ERC20PermitSignature,\n SignSwapTypedDataError\n> {\n const account = useActiveAccount();\n\n return useAsyncTask(\n (typedData: SwapByIntentTypedData | CancelSwapTypedData) => {\n invariant(account, 'Expected an active account to sign swap typed data');\n\n const message = JSON.parse(typedData.message);\n\n return ResultAsync.fromPromise(\n account.signTypedData({\n // silence the rest of the type inference\n types: typedData.types as Record<string, unknown>,\n domain: typedData.domain,\n primaryType: typedData.primaryType,\n message,\n }),\n (err) => SigningError.from(err),\n ).map((signature) => ({\n deadline: message.deadline,\n value: signatureFrom(signature),\n }));\n },\n [account],\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var viem=require('@aave/client/viem'),types=require('@aave/types'),client=require('@aave/client'),G=require('react'),urql=require('urql');require('@aave/core');var actions=require('@aave/client/actions'),graphql=require('@aave/graphql'),viem$1=require('viem');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var G__default=/*#__PURE__*/_interopDefault(G);var i={Loading:()=>({data:void 0,error:void 0,loading:true,paused:false}),Success:e=>({data:e,error:void 0,loading:false,paused:false}),Failure:e=>({data:void 0,error:e,loading:false,paused:false}),Paused:(e,t)=>({data:e,error:t,loading:false,paused:true})};function h({document:e,variables:t,suspense:r,pause:a,selector:n=types.identity,pollInterval:s=0}){let[o,T]=G.useState(true),[{fetching:l,data:u,error:y},E]=urql.useQuery({query:e,variables:t,pause:a,context:G.useMemo(()=>({suspense:r}),[r])});if(G.useEffect(()=>{a||l||T(false);},[l,a]),G.useEffect(()=>{if(s<=0||l||a)return;let f=setTimeout(()=>{E({requestPolicy:"network-only"});},s);return ()=>clearTimeout(f)},[l,E,s,a]),a)return i.Paused(u?n(u.value):void 0,y?client.UnexpectedError.from(y):void 0);if(!r&&o)return i.Loading();if(y){let f=client.UnexpectedError.from(y);if(r)throw f;return i.Failure(f)}return types.invariant(u,"No data returned"),i.Success(n(u.value))}var x={Idle:()=>({called:false,loading:false,data:void 0,error:void 0}),Loading:e=>({called:true,loading:true,data:e,error:void 0}),Success:e=>({called:true,loading:false,data:e,error:void 0}),Failed:e=>({called:true,loading:false,data:void 0,error:e})};function p(e,t){let[r,a]=G.useState(x.Idle()),n=G.useRef(false),s=G.useCallback(e,t);return [G.useCallback(T=>{types.invariant(!n.current,"Cannot execute a task while another is in progress."),n.current=true,a(({data:u})=>({called:true,loading:true,data:u,error:void 0}));let l=s(T);return l.match(u=>{n.current=false,a(x.Success(u));},u=>{n.current=false,a(x.Failed(u));}),l},[s]),r]}var m=class e{constructor(t){this.wait=t;}static ensure(t){return types.invariant(t instanceof e,"Expected PendingTransaction"),t}};var M=G__default.default.createContext(null);function d(){let e=G.useContext(M);return types.invariant(e,"Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>"),e}function P(){let e=d();return p(t=>actions.permitTypedData(e,t),[e])}function Be(e){return p(t=>(types.invariant(e,"Expected a WalletClient to handle the operation result."),viem.sendTransaction(e,t).map(r=>new m(()=>viem.waitForTransactionResult(e,t,r)))),[e])}function Ge(e){let[t]=P();return p(r=>(types.invariant(e,"Expected a WalletClient to sign ERC20 permits"),t(r).andThen(viem.signERC20PermitWith(e))),[t,e])}function He(e){return p(t=>(types.invariant(e,"Expected a WalletClient to sign swap typed data"),viem.signSwapTypedDataWith(e)(t)),[e])}function C({suspense:e=false,pause:t=false,...r}){let a=d();return h({document:graphql.ExchangeRateQuery,variables:{request:r},suspense:e,pause:t,pollInterval:r.at?0:a.context.environment.exchangeRateInterval})}var D=55558n,ie={supply:132136n+D,borrow:250551n,withdraw:195049n,repay:217889n+D,setUserSupplyAsCollateral:240284n};function pe(e){let t=Object.keys(e)[0];return ie[t]??types.never(`Expected gas estimate for action ${t}`)}function le(e){return "supply"in e?e.supply.reserve:"borrow"in e?e.borrow.reserve:"withdraw"in e?e.withdraw.reserve:"repay"in e?e.repay.reserve:"setUserSupplyAsCollateral"in e?e.setUserSupplyAsCollateral.reserve:types.never("Expected reserve id")}function N(e){if("activity"in e&&e.activity)return e.activity.chain.chainId;if("estimate"in e&&e.estimate){let t=le(e.estimate);return graphql.decodeReserveId(t).chainId}}function de(e){if("activity"in e&&e.activity)return e.activity.timestamp}function ce(){let e=d();return p(t=>{let r=types.nonNullable(N(t)),a=viem$1.createPublicClient({chain:viem.supportedChains[r]?viem.supportedChains[r]:types.never(`Expected supported chain for chainId ${r}`),transport:viem$1.http()});return "activity"in t?types.ResultAsync.fromPromise(a.getTransactionReceipt({hash:t.activity.txHash}),n=>client.UnexpectedError.from(n)).map(n=>({chain:t.activity.chain,gasPrice:n.effectiveGasPrice,gasUnits:n.gasUsed})):"estimate"in t&&t.estimate?types.ResultAsync.combine([types.ResultAsync.fromPromise(a.estimateFeesPerGas(),n=>client.UnexpectedError.from(n)),actions.chain(e,{chainId:r}).map(types.nonNullable)]).map(([{maxFeePerGas:n},s])=>({chain:s,gasPrice:n,gasUnits:pe(t.estimate)})):types.okAsync({chain:types.never("Expected chain"),gasPrice:0n,gasUnits:0n})},[e])}function w(e,t){let r=e.gasPrice*e.gasUnits,a=types.bigDecimal(r).rescale(-e.chain.nativeInfo.decimals),n={__typename:"DecimalNumber",decimals:e.chain.nativeInfo.decimals,onChainValue:r,value:a};return {__typename:"NativeAmount",token:{__typename:"NativeToken",info:e.chain.nativeInfo,chain:e.chain},amount:n,fiatAmount:{__typename:"FiatAmount",value:a.mul(t.value),name:t.name,symbol:t.symbol},fiatRate:{__typename:"DecimalNumber",decimals:2,onChainValue:BigInt(t.value.rescale(2).toFixed(0,types.RoundingMode.Down)),value:t.value}}}var dt=({query:e,currency:t=graphql.Currency.Usd,pause:r=false,suspense:a=false})=>{let[n,s]=ce(),o=C({from:{native:N(e)},to:t,at:de(e),pause:r,...a?{suspense:a}:{}});return G.useEffect(()=>{r||s.called||!e||n(e);},[n,r,s.called]),o.paused?i.Paused(s.data&&o.data?w(s.data,o.data):void 0,o.error?o.error:void 0):!s.called||s.loading||o.loading?i.Loading():s.error||o.error?i.Failure(s.error??o.error??types.never("Unknown error")):(types.invariant(s.data&&o.data,"Expected receipt, chain, and rate data"),i.Success(w(s.data,o.data)))};var fe=Object.values(viem.supportedChains);function ft(){return fe}exports.supportedChains=fe;exports.useERC20Permit=Ge;exports.useNetworkFee=dt;exports.useSendTransaction=Be;exports.useSignSwapTypedDataWith=He;exports.useSupportedChains=ft;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var viem=require('@aave/client/viem'),types=require('@aave/types'),client=require('@aave/client'),H=require('react'),urql=require('urql');require('@aave/core');var actions=require('@aave/client/actions'),graphql=require('@aave/graphql'),viem$1=require('viem');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var H__default=/*#__PURE__*/_interopDefault(H);var i={Loading:()=>({data:void 0,error:void 0,loading:true,paused:false}),Success:e=>({data:e,error:void 0,loading:false,paused:false}),Failure:e=>({data:void 0,error:e,loading:false,paused:false}),Paused:(e,t)=>({data:e,error:t,loading:false,paused:true})};function v({document:e,variables:t,suspense:r,pause:a,selector:n=types.identity,pollInterval:s=0,batch:o=true}){let[x,c]=H.useState(true),[{fetching:u,data:y,error:f},E]=urql.useQuery({query:e,variables:t,pause:a,context:H.useMemo(()=>({batch:o,suspense:r}),[o,r])});if(H.useEffect(()=>{a||u||c(false);},[u,a]),H.useEffect(()=>{if(s<=0||u||a)return;let m=setTimeout(()=>{E({requestPolicy:"network-only",batch:false});},s);return ()=>clearTimeout(m)},[u,E,s,a]),a)return i.Paused(y?n(y.value):void 0,f?client.UnexpectedError.from(f):void 0);if(!r&&x)return i.Loading();if(f){let m=client.UnexpectedError.from(f);if(r)throw m;return i.Failure(m)}return types.invariant(y,"No data returned"),i.Success(n(y.value))}var R={Idle:()=>({called:false,loading:false,data:void 0,error:void 0}),Loading:e=>({called:true,loading:true,data:e,error:void 0}),Success:e=>({called:true,loading:false,data:e,error:void 0}),Failed:e=>({called:true,loading:false,data:void 0,error:e})};function p(e,t){let[r,a]=H.useState(R.Idle()),n=H.useRef(false),s=H.useCallback(e,t);return [H.useCallback(x=>{types.invariant(!n.current,"Cannot execute a task while another is in progress."),n.current=true,a(({data:u})=>({called:true,loading:true,data:u,error:void 0}));let c=s(x);return c.match(u=>{n.current=false,a(R.Success(u));},u=>{n.current=false,a(R.Failed(u));}),c},[s]),r]}var T=class e{constructor(t){this.wait=t;}static ensure(t){return types.invariant(t instanceof e,"Expected PendingTransaction"),t}};var j=H__default.default.createContext(null);function l(){let e=H.useContext(j);return types.invariant(e,"Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>"),e}function C(){let e=l();return p(t=>actions.permitTypedData(e,t),[e])}function Ge(e){return p(t=>(types.invariant(e,"Expected a WalletClient to handle the operation result."),viem.sendTransaction(e,t).map(r=>new T(()=>viem.waitForTransactionResult(e,t,r)))),[e])}function He(e){let[t]=C();return p(r=>(types.invariant(e,"Expected a WalletClient to sign ERC20 permits"),t(r).andThen(viem.signERC20PermitWith(e))),[t,e])}function Me(e){return p(t=>(types.invariant(e,"Expected a WalletClient to sign swap typed data"),viem.signSwapTypedDataWith(e)(t)),[e])}function U({suspense:e=false,pause:t=false,...r}){let a=l();return v({document:graphql.ExchangeRateQuery,variables:{request:r},suspense:e,pause:t,pollInterval:r.at?0:a.context.environment.exchangeRateInterval})}var w=55558n,pe={supply:132136n+w,borrow:250551n,withdraw:195049n,repay:217889n+w,setUserSupplyAsCollateral:240284n};function le(e){let t=Object.keys(e)[0];return pe[t]??types.never(`Expected gas estimate for action ${t}`)}function de(e){return "supply"in e?e.supply.reserve:"borrow"in e?e.borrow.reserve:"withdraw"in e?e.withdraw.reserve:"repay"in e?e.repay.reserve:"setUserSupplyAsCollateral"in e?e.setUserSupplyAsCollateral.reserve:types.never("Expected reserve id")}function F(e){if("activity"in e&&e.activity)return e.activity.chain.chainId;if("estimate"in e&&e.estimate){let t=de(e.estimate);return graphql.decodeReserveId(t).chainId}}function ce(e){if("activity"in e&&e.activity)return e.activity.timestamp}function ye(){let e=l();return p(t=>{let r=types.nonNullable(F(t)),a=viem$1.createPublicClient({chain:viem.supportedChains[r]?viem.supportedChains[r]:types.never(`Expected supported chain for chainId ${r}`),transport:viem$1.http()});return "activity"in t?types.ResultAsync.fromPromise(a.getTransactionReceipt({hash:t.activity.txHash}),n=>client.UnexpectedError.from(n)).map(n=>({chain:t.activity.chain,gasPrice:n.effectiveGasPrice,gasUnits:n.gasUsed})):"estimate"in t&&t.estimate?types.ResultAsync.combine([types.ResultAsync.fromPromise(a.estimateFeesPerGas(),n=>client.UnexpectedError.from(n)),actions.chain(e,{chainId:r}).map(types.nonNullable)]).map(([{maxFeePerGas:n},s])=>({chain:s,gasPrice:n,gasUnits:le(t.estimate)})):types.okAsync({chain:types.never("Expected chain"),gasPrice:0n,gasUnits:0n})},[e])}function N(e,t){let r=e.gasPrice*e.gasUnits,a=types.bigDecimal(r).rescale(-e.chain.nativeInfo.decimals),n={__typename:"DecimalNumber",decimals:e.chain.nativeInfo.decimals,onChainValue:r,value:a};return {__typename:"NativeAmount",token:{__typename:"NativeToken",info:e.chain.nativeInfo,chain:e.chain},amount:n,fiatAmount:{__typename:"FiatAmount",value:a.mul(t.value),name:t.name,symbol:t.symbol},fiatRate:{__typename:"DecimalNumber",decimals:2,onChainValue:BigInt(t.value.rescale(2).toFixed(0,types.RoundingMode.Down)),value:t.value}}}var ct=({query:e,currency:t=graphql.Currency.Usd,pause:r=false,suspense:a=false})=>{let[n,s]=ye(),o=U({from:{native:F(e)},to:t,at:ce(e),pause:r,...a?{suspense:a}:{}});return H.useEffect(()=>{r||s.called||!e||n(e);},[n,r,s.called]),o.paused?i.Paused(s.data&&o.data?N(s.data,o.data):void 0,o.error?o.error:void 0):!s.called||s.loading||o.loading?i.Loading():s.error||o.error?i.Failure(s.error??o.error??types.never("Unknown error")):(types.invariant(s.data&&o.data,"Expected receipt, chain, and rate data"),i.Success(N(s.data,o.data)))};var me=Object.values(viem.supportedChains);function mt(){return me}exports.supportedChains=me;exports.useERC20Permit=He;exports.useNetworkFee=ct;exports.useSendTransaction=Ge;exports.useSignSwapTypedDataWith=Me;exports.useSupportedChains=mt;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/results.ts","../../src/helpers/reads.ts","../../src/helpers/tasks.ts","../../src/helpers/writes.ts","../../src/context.tsx","../../src/permits.ts","../../src/viem/adapters.ts","../../src/misc.ts","../../src/viem/useNetworkFee.ts","../../src/viem/index.ts"],"names":["ReadResult","data","error","useSuspendableQuery","document","variables","suspense","pause","selector","identity","pollInterval","loading","setLoading","useState","fetching","executeQuery","useQuery","useMemo","useEffect","timerId","UnexpectedError","unexpected","invariant","AsyncTaskState","useAsyncTask","handler","deps","state","setState","loadingRef","useRef","handle","useCallback","input","result","value","PendingTransaction","_PendingTransaction","wait","AaveContext","React","useAaveClient","client","useContext","usePermitTypedDataAction","request","permitTypedData","useSendTransaction","walletClient","sendTransaction","hash","waitForTransactionResult","useERC20Permit","signERC20PermitWith","useSignSwapTypedDataWith","typedData","signSwapTypedDataWith","useExchangeRate","ExchangeRateQuery","estimatedApprovalGas","gasEstimates","inferGasEstimate","action","key","never","extractReserveId","inferChainId","query","reserveId","decodeReserveId","inferTimestampForExchangeRateLookup","useExecutionDetails","chainId","nonNullable","publicClient","createPublicClient","supportedChains","http","ResultAsync","receipt","fetchChain","maxFeePerGas","chain","okAsync","createNetworkFeeAmount","details","rate","gasCostInWei","gasCost","bigDecimal","amount","RoundingMode","useNetworkFee","currency","Currency","fetchDetails","supportedChainsMap","useSupportedChains"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { UnexpectedError } from '@aave/client';\n\n/**\n * A read hook result.\n *\n * It's a discriminated union of the possible results of a read operation:\n * - Rely on the `loading` value to determine if the `data` or `error` can be evaluated.\n * - If `error` is `undefined`, then `data` value will be available.\n */\nexport type ReadResult<T, E extends UnexpectedError = UnexpectedError> =\n | {\n data: undefined;\n error: undefined;\n loading: true;\n }\n | {\n data: T;\n error: undefined;\n loading: false;\n }\n | {\n data: undefined;\n error: E;\n loading: false;\n };\n\n/**\n * A read hook result that supports pausing.\n */\nexport type PausableReadResult<T, E extends UnexpectedError = UnexpectedError> =\n | {\n data: T | undefined;\n error: E | undefined;\n loading: false;\n paused: true;\n }\n | {\n data: undefined;\n error: undefined;\n loading: true;\n paused: false;\n }\n | {\n data: T;\n error: undefined;\n loading: false;\n paused: false;\n }\n | {\n data: undefined;\n error: E;\n loading: false;\n paused: false;\n };\n\n/**\n * @internal\n */\nexport const ReadResult = {\n Loading: <\n T,\n E extends UnexpectedError = UnexpectedError,\n >(): PausableReadResult<T, E> => ({\n data: undefined,\n error: undefined,\n loading: true,\n paused: false,\n }),\n Success: <T, E extends UnexpectedError = UnexpectedError>(\n data: T,\n ): PausableReadResult<T, E> => ({\n data,\n error: undefined,\n loading: false,\n paused: false,\n }),\n Failure: <T, E extends UnexpectedError = UnexpectedError>(\n error: E,\n ): PausableReadResult<T, E> => ({\n data: undefined,\n error,\n loading: false,\n paused: false,\n }),\n Paused: <T, E extends UnexpectedError = UnexpectedError>(\n data: T | undefined,\n error: E | undefined,\n ): PausableReadResult<T, E> => ({\n data,\n error,\n loading: false,\n paused: true,\n }),\n};\n\n/**\n * A read hook result that supports React Suspense.\n */\nexport type SuspenseResult<T> = {\n data: T;\n};\n\n/**\n * A read hook result that supports React Suspense and can be paused.\n */\nexport type PausableSuspenseResult<T> =\n | {\n paused: true;\n data: undefined;\n }\n | {\n paused: false;\n data: T;\n };\n\nexport type SuspendableResult<T, E extends UnexpectedError = UnexpectedError> =\n | ReadResult<T, E>\n | SuspenseResult<T>\n | PausableReadResult<T, E>\n | PausableSuspenseResult<T>;\n","import { type StandardData, UnexpectedError } from '@aave/client';\nimport {\n type AnyVariables,\n identity,\n invariant,\n type NullishDeep,\n type Prettify,\n} from '@aave/types';\nimport { useEffect, useMemo, useState } from 'react';\nimport { type TypedDocumentNode, useQuery } from 'urql';\nimport {\n type PausableReadResult,\n type PausableSuspenseResult,\n ReadResult,\n type SuspendableResult,\n type SuspenseResult,\n} from './results';\n\nexport type Selector<T, V> = (data: T) => V;\n\nexport type Pausable<T, WhenPaused = NullishDeep<T>> = Prettify<\n WhenPaused & {\n /**\n * Prevents the hook from automatically executing GraphQL query operations.\n *\n * @experimental This is an experimental feature and may change in the future.\n *\n * @remarks\n * `pause` may be set to `true` to stop the query operation from executing\n * automatically. The hook will stop receiving updates and won’t execute the query\n * operation until it’s set to `false`.\n */\n pause: boolean;\n }\n>;\n\nexport type Suspendable = { suspense: true };\n\n/**\n * @internal\n */\nexport type UseSuspendableQueryArgs<\n Value,\n Output,\n Variables extends AnyVariables,\n Suspense extends boolean,\n Pause extends boolean = never,\n> = {\n document: TypedDocumentNode<StandardData<Value>, Variables>;\n variables?: Pause extends boolean ? NullishDeep<Variables> : Variables;\n suspense: Suspense;\n selector?: Selector<Value, Output>;\n pollInterval?: number;\n pause?: Pause;\n};\n\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<Value, Output, Variables, false, Pausable>):\n | ReadResult<Output>\n | PausableReadResult<Output>;\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<Value, Output, Variables, true, Pausable>):\n | SuspenseResult<Output>\n | PausableSuspenseResult<Output>;\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<\n Value,\n Output,\n Variables,\n boolean,\n Pausable\n>): SuspendableResult<Output, UnexpectedError>;\n/**\n * Implementation.\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n>({\n document,\n variables,\n suspense,\n pause,\n selector = identity as Selector<Value, Output>,\n pollInterval = 0,\n}: UseSuspendableQueryArgs<\n Value,\n Output,\n Variables,\n boolean,\n boolean\n>): SuspendableResult<Output, UnexpectedError> {\n const [loading, setLoading] = useState(true);\n const [{ fetching, data, error }, executeQuery] = useQuery({\n query: document,\n variables: variables as Variables,\n pause,\n context: useMemo(\n () => ({\n suspense,\n }),\n [suspense],\n ),\n });\n\n useEffect(() => {\n if (pause) return;\n\n if (!fetching) {\n setLoading(false);\n }\n }, [fetching, pause]);\n\n useEffect(() => {\n if (pollInterval <= 0 || fetching || pause) return undefined;\n\n const timerId = setTimeout(() => {\n executeQuery({\n requestPolicy: 'network-only',\n });\n }, pollInterval);\n\n return () => clearTimeout(timerId);\n }, [fetching, executeQuery, pollInterval, pause]);\n\n if (pause) {\n return ReadResult.Paused(\n data ? selector(data.value) : undefined,\n error ? UnexpectedError.from(error) : undefined,\n );\n }\n\n if (!suspense && loading) {\n return ReadResult.Loading();\n }\n\n if (error) {\n const unexpected = UnexpectedError.from(error);\n if (suspense) {\n throw unexpected;\n }\n\n return ReadResult.Failure(unexpected);\n }\n\n invariant(data, 'No data returned');\n\n return ReadResult.Success(selector(data.value));\n}\n","import { invariant, type ResultAsync } from '@aave/types';\nimport { type DependencyList, useCallback, useRef, useState } from 'react';\n\n/**\n * An async task is a function that can be executed multiple times and that can be in a pending state.\n *\n * @internal\n */\nexport type AsyncTask<TInput, TResult extends ResultAsync<unknown, unknown>> = (\n input: TInput,\n) => TResult;\n\n/**\n * The initial state of a async task.\n */\nexport type AsyncTaskIdle = {\n called: boolean;\n loading: false;\n data: undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task during the loading.\n */\nexport type AsyncTaskLoading<TData> = {\n called: true;\n loading: true;\n data: TData | undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task after a successful call.\n */\nexport type AsyncTaskSuccess<TData> = {\n called: true;\n loading: false;\n data: TData;\n error: undefined;\n};\n\n/**\n * The state of a async task after a failed call.\n */\nexport type AsyncTaskError<TError> = {\n called: true;\n loading: false;\n data: undefined;\n error: TError;\n};\n\n/**\n * The possible statuses of a async task.\n */\nexport type AsyncTaskState<TData, TError> =\n | AsyncTaskIdle\n | AsyncTaskLoading<TData>\n | AsyncTaskSuccess<TData>\n | AsyncTaskError<TError>;\n\nconst AsyncTaskState = {\n Idle: <TData, TError>(): AsyncTaskState<TData, TError> => ({\n called: false,\n loading: false,\n data: undefined,\n error: undefined,\n }),\n Loading: <TData, TError>(data?: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: true,\n data,\n error: undefined,\n }),\n Success: <TData, TError>(data: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data,\n error: undefined,\n }),\n Failed: <TData, TError>(error: TError): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data: undefined,\n error,\n }),\n};\n\n/**\n * A async task React Hook is a lightweight wrapper for an asynchronous function.\n * It allows tracking of the task's execution status and provides access to the\n * last error that occurred during the task's execution, if any.\n *\n * ```ts\n * const [execute, { called, loading, data, error }]: UseAsyncTask<TData, TError, TInput> = useAnyAsyncTask();\n *\n * if (!called) {\n * // data === undefined\n * // error === undefined\n * return <p>Click the button to execute the task</p>;\n * }\n *\n * if (loading) {\n * // data === undefined on first call\n * // data === TData from previous successful call\n * // error === undefined\n * return <Loader />;\n * }\n *\n * if (error) {\n * // data === undefined\n * // error === TError\n * return <p>Something went wrong: {error.message}</p>;\n * }\n *\n * // called === true\n * // data === TData\n * // error === undefined\n * return <p>Task completed: {data}</p>;\n * ```\n */\nexport type UseAsyncTask<TInput, TValue, TError> = [\n AsyncTask<TInput, ResultAsync<TValue, TError>>,\n AsyncTaskState<TValue, TError>,\n];\n\n/**\n * @internal\n */\nexport function useAsyncTask<\n TInput,\n TValue,\n TError,\n TResult extends ResultAsync<TValue, TError>,\n>(\n handler: AsyncTask<TInput, TResult>,\n deps: DependencyList,\n): UseAsyncTask<TInput, TValue, TError> {\n const [state, setState] = useState(AsyncTaskState.Idle<TValue, TError>());\n const loadingRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: useAsyncTask is a low-level hook\n const handle = useCallback(handler, deps);\n\n const execute = useCallback(\n (input: TInput) => {\n invariant(\n !loadingRef.current,\n 'Cannot execute a task while another is in progress.',\n );\n\n loadingRef.current = true;\n setState(({ data }) => {\n return {\n called: true,\n loading: true,\n data,\n error: undefined,\n };\n });\n\n const result = handle(input);\n\n result.match(\n (value) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Success(value));\n },\n (error) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Failed(error));\n },\n );\n\n return result;\n },\n [handle],\n );\n\n return [execute, state];\n}\n","import type { TransactionResult } from '@aave/client';\nimport {\n CancelError,\n type SigningError,\n type TimeoutError,\n type TransactionError,\n type UnexpectedError,\n} from '@aave/core';\nimport type {\n Erc20ApprovalRequired,\n PreContractActionRequired,\n TransactionRequest,\n} from '@aave/graphql';\nimport type { ResultAsync } from '@aave/types';\nimport { invariant } from '@aave/types';\nimport type { UseAsyncTask } from './tasks';\n\n/**\n * The errors that could occur in the early stage of sending a transaction.\n */\nexport type SendTransactionError = CancelError | SigningError | UnexpectedError;\n\nexport type CancelOperation = (\n message: string,\n) => ResultAsync<never, CancelError>;\n\n/**\n * @internal\n */\nexport const cancel: CancelOperation = (message: string) =>\n CancelError.from(message).asResultAsync();\n\nexport type TransactionHandlerOptions = {\n cancel: CancelOperation;\n};\n\n/**\n * The errors that could occur in the late stages of a transaction.\n */\nexport type PendingTransactionError =\n | CancelError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\nexport class PendingTransaction {\n constructor(\n /**\n * @internal Do NOT rely on this method. It's used internally by the SDK and may be subject to breaking changes.\n */\n public readonly wait: () => ResultAsync<\n TransactionResult,\n PendingTransactionError\n >,\n ) {}\n\n /**\n * @internal\n */\n static ensure<T>(value: T): PendingTransaction & T {\n invariant(\n value instanceof PendingTransaction,\n 'Expected PendingTransaction',\n );\n return value as PendingTransaction & T;\n }\n}\n\nexport type UseSendTransactionResult = UseAsyncTask<\n TransactionRequest,\n PendingTransaction,\n SendTransactionError\n>;\n\n/**\n * The handler for sending Aave transactions.\n */\nexport type TransactionHandler = (\n result:\n | TransactionRequest\n | Erc20ApprovalRequired\n | PreContractActionRequired,\n options: TransactionHandlerOptions,\n) => ResultAsync<PendingTransaction, SendTransactionError>;\n","import type { AaveClient } from '@aave/client';\nimport { invariant } from '@aave/types';\nimport React, { type ReactNode, useContext } from 'react';\nimport { Provider as UrqlProvider } from 'urql';\n\nconst AaveContext = React.createContext<AaveClient | null>(null);\n\n/**\n * @internal\n */\nexport type AaveContextProviderProps = {\n children: ReactNode;\n client: AaveClient;\n};\n\n/**\n * @internal\n */\nexport function AaveContextProvider({\n children,\n client,\n}: AaveContextProviderProps) {\n return (\n <AaveContext.Provider value={client}>\n <UrqlProvider value={client.urql}>{children}</UrqlProvider>\n </AaveContext.Provider>\n );\n}\n\n/**\n * @internal\n */\nexport function useAaveClient(): AaveClient {\n const client = useContext(AaveContext);\n\n invariant(\n client,\n 'Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>',\n );\n\n return client;\n}\n","import type { UnexpectedError } from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport type { PermitRequest, PermitTypedDataResponse } from '@aave/graphql';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers';\n\n/**\n * @internal\n */\nexport function usePermitTypedDataAction(): UseAsyncTask<\n PermitRequest,\n PermitTypedDataResponse,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: PermitRequest) => permitTypedData(client, request),\n [client],\n );\n}\n","import type { SigningError, UnexpectedError } from '@aave/client';\nimport {\n sendTransaction,\n signERC20PermitWith,\n signSwapTypedDataWith,\n waitForTransactionResult,\n} from '@aave/client/viem';\nimport type {\n ERC20PermitSignature,\n PermitRequest,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport { invariant } from '@aave/types';\nimport type { WalletClient } from 'viem';\n\nimport {\n PendingTransaction,\n type UseAsyncTask,\n type UseSendTransactionResult,\n useAsyncTask,\n} from '../helpers';\nimport { usePermitTypedDataAction } from '../permits';\n\n/**\n * A hook that provides a way to send Aave transactions using a viem WalletClient instance.\n *\n * Use the `useWalletClient` wagmi hook to get the `WalletClient` instance, then pass it to this hook to create a function that can be used to send transactions.\n *\n * ```ts\n * const { data: wallet } = useWalletClient(); // wagmi hook\n *\n * const [sendTransaction] = useSendTransaction(wallet);\n * ```\n *\n * @param walletClient - The wallet client to use for sending transactions.\n */\nexport function useSendTransaction(\n walletClient: WalletClient | undefined,\n): UseSendTransactionResult {\n return useAsyncTask(\n (request: TransactionRequest) => {\n invariant(\n walletClient,\n 'Expected a WalletClient to handle the operation result.',\n );\n\n return sendTransaction(walletClient, request).map(\n (hash) =>\n new PendingTransaction(() =>\n waitForTransactionResult(walletClient, request, hash),\n ),\n );\n },\n [walletClient],\n );\n}\n\nexport type SignERC20PermitError = SigningError | UnexpectedError;\n\n/**\n * A hook that provides a way to sign ERC20 permits using a viem WalletClient instance.\n *\n * ```ts\n * const { data: wallet } = useWalletClient(); // wagmi hook\n * const [signERC20Permit, { loading, error, data }] = useERC20Permit(wallet);\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * supply: {\n * sender: evmAddress(wallet.account.address), // User's address\n * reserve: {\n * reserveId: reserve.id,\n * chainId: reserve.chain.chainId,\n * spoke: reserve.spoke.address,\n * },\n * amount: {\n * value: bigDecimal(42), // 42 USDC\n * },\n * },\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 Permit signature:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(\n walletClient: WalletClient | undefined,\n): UseAsyncTask<PermitRequest, ERC20PermitSignature, SignERC20PermitError> {\n const [permitTypedData] = usePermitTypedDataAction();\n\n return useAsyncTask(\n (request: PermitRequest) => {\n invariant(walletClient, 'Expected a WalletClient to sign ERC20 permits');\n\n return permitTypedData(request).andThen(\n signERC20PermitWith(walletClient),\n );\n },\n [permitTypedData, walletClient],\n );\n}\n\nexport type SignSwapTypedDataError = SigningError | UnexpectedError;\n\n/**\n * @internal\n * A hook that provides a way to sign swap typed data using a viem WalletClient instance.\n *\n * ```ts\n * const { data: wallet } = useWalletClient(); // wagmi hook\n * const [signSwapTypedData, { loading, error, data }] = useSignSwapTypedDataWith(wallet);\n *\n * const run = async () => {\n * const result = await signSwapTypedData(swapTypedData);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Swap typed data signed:', result.value);\n * };\n * ```\n */\nexport function useSignSwapTypedDataWith(\n walletClient: WalletClient | undefined,\n): UseAsyncTask<\n SwapByIntentTypedData,\n ERC20PermitSignature,\n SignSwapTypedDataError\n> {\n return useAsyncTask(\n (typedData: SwapByIntentTypedData) => {\n invariant(\n walletClient,\n 'Expected a WalletClient to sign swap typed data',\n );\n\n return signSwapTypedDataWith(walletClient)(typedData);\n },\n [walletClient],\n );\n}\n","import type { CurrencyQueryOptions } from '@aave/client';\nimport { exchangeRate } from '@aave/client/actions';\nimport type { UnexpectedError } from '@aave/core';\nimport type { Chain, ExchangeRateRequest, FiatAmount } from '@aave/graphql';\nimport {\n type ActivityItem,\n ChainQuery,\n type ChainRequest,\n ChainsFilter,\n ChainsQuery,\n ExchangeRateQuery,\n type NativeAmount,\n type PreviewAction,\n} from '@aave/graphql';\nimport type { NullishDeep, Prettify } from '@aave/types';\nimport { useAaveClient } from './context';\nimport {\n type Pausable,\n type PausableReadResult,\n type PausableSuspenseResult,\n type ReadResult,\n type Suspendable,\n type SuspendableResult,\n type SuspenseResult,\n useSuspendableQuery,\n} from './helpers';\nimport { type UseAsyncTask, useAsyncTask } from './helpers/tasks';\n\nexport type UseChainArgs = ChainRequest;\n\n/**\n * Fetch a specific chain by chain ID.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useChain({\n * chainId: chainId(1),\n * suspense: true,\n * });\n * // data will be Chain | null\n * ```\n */\nexport function useChain(\n args: UseChainArgs & Suspendable,\n): SuspenseResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useChain({\n * chainId: chainId(1),\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useChain(\n args: Pausable<UseChainArgs> & Suspendable,\n): PausableSuspenseResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * ```tsx\n * const { data, error, loading } = useChain({\n * chainId: chainId(1),\n * });\n * // data will be Chain | null\n * ```\n */\nexport function useChain(args: UseChainArgs): ReadResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useChain({\n * chainId: chainId(1),\n * pause: true,\n * });\n * ```\n */\nexport function useChain(\n args: Pausable<UseChainArgs>,\n): PausableReadResult<Chain | null>;\n\nexport function useChain({\n suspense = false,\n pause = false,\n ...request\n}: NullishDeep<UseChainArgs> & {\n suspense?: boolean;\n pause?: boolean;\n}): SuspendableResult<Chain | null, UnexpectedError> {\n return useSuspendableQuery({\n document: ChainQuery,\n variables: {\n request,\n },\n suspense,\n pause,\n });\n}\n\nexport type UseChainsArgs = {\n filter: ChainsFilter;\n};\n/**\n * Fetches the list of supported chains.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useChains({\n * filter: ChainsFilter.ALL,\n * suspense: true,\n * });\n * ```\n */\nexport function useChains(\n args: UseChainsArgs & Suspendable,\n): SuspenseResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useChains({\n * filter: ChainsFilter.ALL,\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useChains(\n args: Pausable<UseChainsArgs> & Suspendable,\n): PausableSuspenseResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * ```tsx\n * const { data, error, loading } = useChains({\n * filter: ChainsFilter.ALL,\n * });\n * ```\n */\nexport function useChains(args?: UseChainsArgs): ReadResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useChains({\n * filter: ChainsFilter.ALL,\n * pause: true,\n * });\n * ```\n */\nexport function useChains(\n args?: Pausable<UseChainsArgs>,\n): PausableReadResult<Chain[]>;\n\nexport function useChains(\n {\n suspense = false,\n pause = false,\n filter,\n }: NullishDeep<UseChainsArgs> & {\n suspense?: boolean;\n pause?: boolean;\n } = { filter: ChainsFilter.ALL },\n): SuspendableResult<Chain[], UnexpectedError> {\n return useSuspendableQuery({\n document: ChainsQuery,\n variables: { filter },\n suspense,\n pause,\n });\n}\n\n/**\n * Fetches exchange rates between tokens and fiat currencies.\n *\n * ```tsx\n * const [getExchangeRate, gettingRate] = useExchangeRateAction();\n *\n * const loading = gettingRate.loading;\n * const error = gettingRate.error;\n *\n * // …\n *\n * const result = await getExchangeRate({\n * from: { erc20: { chainId: chainId(1), address: evmAddress('0xA0b86a33E6...') } },\n * to: Currency.Usd,\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Exchange rate:', result.value);\n * ```\n */\nexport function useExchangeRateAction(): UseAsyncTask<\n ExchangeRateRequest,\n FiatAmount,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: ExchangeRateRequest) => exchangeRate(client, request),\n [client],\n );\n}\n\nexport type UseExchangeRateArgs = ExchangeRateRequest;\n\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * suspense: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: UseExchangeRateArgs & Suspendable,\n): SuspenseResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: Pausable<UseExchangeRateArgs> & Suspendable,\n): PausableSuspenseResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * ```tsx\n * const { data, error, loading } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * });\n *\n * <Component value={somewhere} fxRate={data} />\n * ```\n */\nexport function useExchangeRate(\n args: UseExchangeRateArgs,\n): ReadResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * pause: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: Pausable<UseExchangeRateArgs>,\n): PausableReadResult<FiatAmount>;\n\nexport function useExchangeRate({\n suspense = false,\n pause = false,\n ...request\n}: NullishDeep<UseExchangeRateArgs> & {\n suspense?: boolean;\n pause?: boolean;\n}): SuspendableResult<FiatAmount, UnexpectedError> {\n const client = useAaveClient();\n\n return useSuspendableQuery({\n document: ExchangeRateQuery,\n variables: { request },\n suspense,\n pause,\n pollInterval: request.at\n ? 0\n : client.context.environment.exchangeRateInterval,\n });\n}\n\nexport type UseNetworkFeeRequestQuery =\n | {\n activity: ActivityItem;\n }\n | {\n estimate: PreviewAction;\n };\n\nexport type UseNetworkFeeArgs = Prettify<\n {\n query: UseNetworkFeeRequestQuery;\n } & CurrencyQueryOptions\n>;\n\ntype PausableUseNetworkFeeArgs = Partial<\n {\n query: Partial<UseNetworkFeeRequestQuery>;\n } & CurrencyQueryOptions\n>;\n\n/**\n * Fetch the network fee for an ActivityItem.\n *\n * @experimental This hook is experimental and may be subject to breaking changes.\n */\nexport type UseNetworkFee<T extends NativeAmount = NativeAmount> =\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useNetworkFee({\n * query: { activity },\n * suspense: true,\n * });\n *\n * data: NativeAmount\n * ```\n */\n ((args: UseNetworkFeeArgs & Suspendable) => SuspenseResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data, paused } = useNetworkFee({\n * query: { activity },\n * suspense: true,\n * pause: true,\n * });\n *\n * data: NativeAmount | undefined\n * ```\n */\n ((\n args: Pausable<UseNetworkFeeArgs, PausableUseNetworkFeeArgs> &\n Suspendable,\n ) => PausableSuspenseResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * ```tsx\n * const { data, error, loading } = useNetworkFee({\n * query: { activity },\n * });\n * ```\n */\n ((args: UseNetworkFeeArgs) => ReadResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useNetworkFee({\n * query: { activity },\n * pause: true,\n * });\n *\n * data: NativeAmount | undefined\n * ```\n */\n ((\n args: Pausable<UseNetworkFeeArgs, PausableUseNetworkFeeArgs>,\n ) => PausableReadResult<T>);\n","import { UnexpectedError } from '@aave/client';\nimport { chain as fetchChain } from '@aave/client/actions';\nimport { supportedChains } from '@aave/client/viem';\nimport {\n type Chain,\n Currency,\n type DecimalNumber,\n decodeReserveId,\n type FiatAmount,\n type NativeAmount,\n type PreviewAction,\n type ReserveId,\n} from '@aave/graphql';\nimport {\n bigDecimal,\n type ChainId,\n invariant,\n never,\n nonNullable,\n okAsync,\n ResultAsync,\n RoundingMode,\n} from '@aave/types';\nimport { useEffect } from 'react';\nimport { createPublicClient, http } from 'viem';\nimport { useAaveClient } from '../context';\nimport {\n ReadResult,\n type SuspendableResult,\n type UseAsyncTask,\n useAsyncTask,\n} from '../helpers';\nimport {\n type UseNetworkFee,\n type UseNetworkFeeRequestQuery,\n useExchangeRate,\n} from '../misc';\n\nconst estimatedApprovalGas = 55_558n;\n\nconst gasEstimates: Record<keyof PreviewAction, bigint> = {\n supply: 132_136n + estimatedApprovalGas,\n borrow: 250_551n,\n withdraw: 195_049n,\n repay: 217_889n + estimatedApprovalGas,\n setUserSupplyAsCollateral: 240_284n,\n};\n\nfunction inferGasEstimate(action: PreviewAction): bigint {\n const key = Object.keys(action)[0] as keyof PreviewAction;\n return gasEstimates[key] ?? never(`Expected gas estimate for action ${key}`);\n}\n\nfunction extractReserveId(action: PreviewAction): ReserveId {\n if ('supply' in action) {\n return action.supply.reserve;\n }\n\n if ('borrow' in action) {\n return action.borrow.reserve;\n }\n\n if ('withdraw' in action) {\n return action.withdraw.reserve;\n }\n\n if ('repay' in action) {\n return action.repay.reserve;\n }\n\n if ('setUserSupplyAsCollateral' in action) {\n return action.setUserSupplyAsCollateral.reserve;\n }\n\n return never('Expected reserve id');\n}\n\nfunction inferChainId(query: UseNetworkFeeRequestQuery): ChainId | undefined {\n if ('activity' in query && query.activity) {\n return query.activity.chain.chainId;\n }\n\n if ('estimate' in query && query.estimate) {\n const reserveId = extractReserveId(query.estimate);\n\n return decodeReserveId(reserveId).chainId;\n }\n\n return undefined;\n}\n\nfunction inferTimestampForExchangeRateLookup(\n query: UseNetworkFeeRequestQuery,\n): Date | undefined {\n if ('activity' in query && query.activity) {\n return query.activity.timestamp;\n }\n return undefined; // i.e., now\n}\n\ntype ExecutionDetails = {\n chain: Chain;\n gasPrice: bigint;\n gasUnits: bigint;\n};\n\nfunction useExecutionDetails(): UseAsyncTask<\n UseNetworkFeeRequestQuery,\n ExecutionDetails,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (query) => {\n const chainId = nonNullable(inferChainId(query));\n const publicClient = createPublicClient({\n chain: supportedChains[chainId]\n ? supportedChains[chainId]\n : never(`Expected supported chain for chainId ${chainId}`),\n transport: http(),\n });\n\n if ('activity' in query) {\n return ResultAsync.fromPromise(\n publicClient.getTransactionReceipt({ hash: query.activity.txHash }),\n (error) => UnexpectedError.from(error),\n ).map((receipt) => {\n return {\n chain: query.activity.chain,\n gasPrice: receipt.effectiveGasPrice,\n gasUnits: receipt.gasUsed,\n };\n });\n }\n\n if ('estimate' in query && query.estimate) {\n return ResultAsync.combine([\n ResultAsync.fromPromise(publicClient.estimateFeesPerGas(), (error) =>\n UnexpectedError.from(error),\n ),\n fetchChain(client, { chainId }).map(nonNullable),\n ]).map(([{ maxFeePerGas }, chain]) => {\n return {\n chain,\n gasPrice: maxFeePerGas,\n gasUnits: inferGasEstimate(query.estimate),\n };\n });\n }\n\n return okAsync({\n chain: never('Expected chain'),\n gasPrice: 0n,\n gasUnits: 0n,\n });\n },\n [client],\n );\n}\n\nfunction createNetworkFeeAmount(\n details: ExecutionDetails,\n rate: FiatAmount,\n): NativeAmount {\n const gasCostInWei = details.gasPrice * details.gasUnits;\n const gasCost = bigDecimal(gasCostInWei).rescale(\n -details.chain.nativeInfo.decimals,\n );\n\n const amount: DecimalNumber = {\n __typename: 'DecimalNumber',\n decimals: details.chain.nativeInfo.decimals,\n onChainValue: gasCostInWei,\n value: gasCost,\n };\n\n return {\n __typename: 'NativeAmount',\n token: {\n __typename: 'NativeToken',\n info: details.chain.nativeInfo,\n chain: details.chain,\n },\n amount,\n fiatAmount: {\n __typename: 'FiatAmount',\n value: gasCost.mul(rate.value),\n name: rate.name,\n symbol: rate.symbol,\n },\n fiatRate: {\n __typename: 'DecimalNumber',\n decimals: 2,\n onChainValue: BigInt(rate.value.rescale(2).toFixed(0, RoundingMode.Down)),\n value: rate.value,\n },\n };\n}\n\n/**\n * Fetch the network fee for an ActivityItem or estimates networkf feed for a preview action.\n *\n * @experimental This hook is experimental and may be subject to breaking changes.\n */\nexport const useNetworkFee: UseNetworkFee = (({\n query,\n currency = Currency.Usd,\n pause = false,\n suspense = false,\n}: {\n query: UseNetworkFeeRequestQuery;\n currency?: Currency;\n pause?: boolean;\n suspense?: boolean;\n}): SuspendableResult<NativeAmount, UnexpectedError> => {\n const [fetchDetails, details] = useExecutionDetails();\n\n const rate = useExchangeRate({\n from: {\n native: inferChainId(query),\n },\n to: currency,\n at: inferTimestampForExchangeRateLookup(query),\n pause,\n ...(suspense ? { suspense } : {}),\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: query omitted since it's usually a literal object that changes at every render\n useEffect(() => {\n if (pause || details.called || !query) return;\n\n fetchDetails(query);\n }, [fetchDetails, pause, details.called]);\n\n if (rate.paused) {\n return ReadResult.Paused(\n details.data && rate.data\n ? createNetworkFeeAmount(details.data, rate.data)\n : undefined,\n rate.error ? rate.error : undefined,\n );\n }\n\n if (!details.called || details.loading || rate.loading) {\n return ReadResult.Loading();\n }\n\n if (details.error || rate.error) {\n return ReadResult.Failure(\n details.error ?? rate.error ?? never('Unknown error'),\n );\n }\n\n invariant(\n details.data && rate.data,\n 'Expected receipt, chain, and rate data',\n );\n\n return ReadResult.Success(createNetworkFeeAmount(details.data, rate.data));\n}) as UseNetworkFee;\n","import { supportedChains as supportedChainsMap } from '@aave/client/viem';\nimport type { Chain } from 'viem';\n\nexport * from './adapters';\nexport * from './useNetworkFee';\n\n/**\n * The list of supported chains typically used with wagmi config.\n */\nexport const supportedChains: [Chain, ...Chain[]] = Object.values(\n supportedChainsMap,\n) as [Chain, ...Chain[]];\n/**\n * A hook that provides a way to get the list of supported chains using viem.\n *\n * @returns The list of supported chains using viem.\n */\nexport function useSupportedChains(): [Chain, ...Chain[]] {\n return supportedChains;\n}\n"]}
1
+ {"version":3,"sources":["../../src/helpers/results.ts","../../src/helpers/reads.ts","../../src/helpers/tasks.ts","../../src/helpers/writes.ts","../../src/context.tsx","../../src/permits.ts","../../src/viem/adapters.ts","../../src/misc.ts","../../src/viem/useNetworkFee.ts","../../src/viem/index.ts"],"names":["ReadResult","data","error","useSuspendableQuery","document","variables","suspense","pause","selector","identity","pollInterval","batch","loading","setLoading","useState","fetching","executeQuery","useQuery","useMemo","useEffect","timerId","UnexpectedError","unexpected","invariant","AsyncTaskState","useAsyncTask","handler","deps","state","setState","loadingRef","useRef","handle","useCallback","input","result","value","PendingTransaction","_PendingTransaction","wait","AaveContext","React","useAaveClient","client","useContext","usePermitTypedDataAction","request","permitTypedData","useSendTransaction","walletClient","sendTransaction","hash","waitForTransactionResult","useERC20Permit","signERC20PermitWith","useSignSwapTypedDataWith","typedData","signSwapTypedDataWith","useExchangeRate","ExchangeRateQuery","estimatedApprovalGas","gasEstimates","inferGasEstimate","action","key","never","extractReserveId","inferChainId","query","reserveId","decodeReserveId","inferTimestampForExchangeRateLookup","useExecutionDetails","chainId","nonNullable","publicClient","createPublicClient","supportedChains","http","ResultAsync","receipt","fetchChain","maxFeePerGas","chain","okAsync","createNetworkFeeAmount","details","rate","gasCostInWei","gasCost","bigDecimal","amount","RoundingMode","useNetworkFee","currency","Currency","fetchDetails","supportedChainsMap","useSupportedChains"],"mappings":"iYA0DO,IAAMA,CAAAA,CAAa,CACxB,OAAA,CAAS,KAGyB,CAChC,IAAA,CAAM,OACN,KAAA,CAAO,MAAA,CACP,OAAA,CAAS,IAAA,CACT,OAAQ,KACV,CAAA,CAAA,CACA,OAAA,CACEC,CAAAA,GAC8B,CAC9B,IAAA,CAAAA,CAAAA,CACA,KAAA,CAAO,OACP,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,KACV,GACA,OAAA,CACEC,CAAAA,GAC8B,CAC9B,IAAA,CAAM,OACN,KAAA,CAAAA,CAAAA,CACA,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,KACV,CAAA,CAAA,CACA,MAAA,CAAQ,CACND,CAAAA,CACAC,CAAAA,IAC8B,CAC9B,IAAA,CAAAD,EACA,KAAA,CAAAC,CAAAA,CACA,OAAA,CAAS,KAAA,CACT,OAAQ,IACV,CAAA,CACF,CAAA,CCmBO,SAASC,CAAAA,CAId,CACA,QAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CAAWC,cAAAA,CACX,YAAA,CAAAC,EAAe,CAAA,CACf,KAAA,CAAAC,CAAAA,CAAQ,IACV,CAAA,CAM+C,CAC7C,GAAM,CAACC,EAASC,CAAU,CAAA,CAAIC,UAAAA,CAAS,IAAI,EACrC,CAAC,CAAE,QAAA,CAAAC,CAAAA,CAAU,KAAAd,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAGc,CAAY,CAAA,CAAIC,aAAAA,CAAS,CACzD,MAAOb,CAAAA,CACP,SAAA,CAAWC,CAAAA,CACX,KAAA,CAAAE,EACA,OAAA,CAASW,SAAAA,CACP,KAAO,CACL,MAAAP,CAAAA,CACA,QAAA,CAAAL,CACF,CAAA,CAAA,CACA,CAACK,CAAAA,CAAOL,CAAQ,CAClB,CACF,CAAC,CAAA,CAuBD,GArBAa,WAAAA,CAAU,IAAM,CACVZ,CAAAA,EAECQ,CAAAA,EACHF,EAAW,KAAK,EAEpB,CAAA,CAAG,CAACE,CAAAA,CAAUR,CAAK,CAAC,CAAA,CAEpBY,YAAU,IAAM,CACd,GAAIT,CAAAA,EAAgB,GAAKK,CAAAA,EAAYR,CAAAA,CAAO,OAE5C,IAAMa,EAAU,UAAA,CAAW,IAAM,CAC/BJ,CAAAA,CAAa,CACX,aAAA,CAAe,cAAA,CACf,KAAA,CAAO,KACT,CAAC,EACH,CAAA,CAAGN,CAAY,EAEf,OAAO,IAAM,YAAA,CAAaU,CAAO,CACnC,CAAA,CAAG,CAACL,CAAAA,CAAUC,CAAAA,CAAcN,CAAAA,CAAcH,CAAK,CAAC,CAAA,CAE5CA,EACF,OAAOP,CAAAA,CAAW,MAAA,CAChBC,CAAAA,CAAOO,EAASP,CAAAA,CAAK,KAAK,CAAA,CAAI,MAAA,CAC9BC,EAAQmB,sBAAAA,CAAgB,IAAA,CAAKnB,CAAK,CAAA,CAAI,MACxC,CAAA,CAGF,GAAI,CAACI,GAAYM,CAAAA,CACf,OAAOZ,CAAAA,CAAW,OAAA,GAGpB,GAAIE,CAAAA,CAAO,CACT,IAAMoB,EAAaD,sBAAAA,CAAgB,IAAA,CAAKnB,CAAK,CAAA,CAC7C,GAAII,CAAAA,CACF,MAAMgB,CAAAA,CAGR,OAAOtB,CAAAA,CAAW,OAAA,CAAQsB,CAAU,CACtC,CAEA,OAAAC,eAAAA,CAAUtB,CAAAA,CAAM,kBAAkB,EAE3BD,CAAAA,CAAW,OAAA,CAAQQ,CAAAA,CAASP,CAAAA,CAAK,KAAK,CAAC,CAChD,CChIA,IAAMuB,CAAAA,CAAiB,CACrB,IAAA,CAAM,KAAqD,CACzD,MAAA,CAAQ,MACR,OAAA,CAAS,KAAA,CACT,IAAA,CAAM,MAAA,CACN,MAAO,MACT,CAAA,CAAA,CACA,OAAA,CAAyBvB,CAAAA,GAAiD,CACxE,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,IAAA,CACT,IAAA,CAAAA,CAAAA,CACA,KAAA,CAAO,MACT,GACA,OAAA,CAAyBA,CAAAA,GAAgD,CACvE,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,KAAA,CACT,IAAA,CAAAA,EACA,KAAA,CAAO,MACT,CAAA,CAAA,CACA,MAAA,CAAwBC,CAAAA,GAAkD,CACxE,MAAA,CAAQ,IAAA,CACR,QAAS,KAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAAA,CACF,CAAA,CACF,CAAA,CA2CO,SAASuB,CAAAA,CAMdC,EACAC,CAAAA,CACsC,CACtC,GAAM,CAACC,CAAAA,CAAOC,CAAQ,CAAA,CAAIf,UAAAA,CAASU,EAAe,IAAA,EAAsB,CAAA,CAClEM,CAAAA,CAAaC,SAAO,KAAK,CAAA,CAEzBC,CAAAA,CAASC,aAAAA,CAAYP,EAASC,CAAI,CAAA,CAqCxC,OAAO,CAnCSM,aAAAA,CACbC,CAAAA,EAAkB,CACjBX,eAAAA,CACE,CAACO,CAAAA,CAAW,OAAA,CACZ,qDACF,CAAA,CAEAA,EAAW,OAAA,CAAU,IAAA,CACrBD,CAAAA,CAAS,CAAC,CAAE,IAAA,CAAA5B,CAAK,CAAA,IACR,CACL,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,IAAA,CACT,KAAAA,CAAAA,CACA,KAAA,CAAO,MACT,CAAA,CACD,EAED,IAAMkC,CAAAA,CAASH,CAAAA,CAAOE,CAAK,EAE3B,OAAAC,CAAAA,CAAO,KAAA,CACJC,CAAAA,EAAU,CACTN,CAAAA,CAAW,OAAA,CAAU,KAAA,CACrBD,EAASL,CAAAA,CAAe,OAAA,CAAQY,CAAK,CAAC,EACxC,CAAA,CACClC,CAAAA,EAAU,CACT4B,CAAAA,CAAW,QAAU,KAAA,CACrBD,CAAAA,CAASL,CAAAA,CAAe,MAAA,CAAOtB,CAAK,CAAC,EACvC,CACF,EAEOiC,CACT,CAAA,CACA,CAACH,CAAM,CACT,CAAA,CAEiBJ,CAAK,CACxB,CCtIO,IAAMS,EAAN,MAAMC,CAAmB,CAC9B,WAAA,CAIkBC,EAIhB,CAJgB,IAAA,CAAA,IAAA,CAAAA,EAIf,CAKH,OAAO,MAAA,CAAUH,CAAAA,CAAkC,CACjD,OAAAb,eAAAA,CACEa,CAAAA,YAAiBE,CAAAA,CACjB,6BACF,EACOF,CACT,CACF,CAAA,CC7DA,IAAMI,CAAAA,CAAcC,kBAAAA,CAAM,cAAiC,IAAI,CAAA,CA2BxD,SAASC,CAAAA,EAA4B,CAC1C,IAAMC,CAAAA,CAASC,YAAAA,CAAWJ,CAAW,CAAA,CAErC,OAAAjB,eAAAA,CACEoB,CAAAA,CACA,kFACF,CAAA,CAEOA,CACT,CChCO,SAASE,GAId,CACA,IAAMF,CAAAA,CAASD,CAAAA,GAEf,OAAOjB,CAAAA,CACJqB,CAAAA,EAA2BC,uBAAAA,CAAgBJ,CAAAA,CAAQG,CAAO,CAAA,CAC3D,CAACH,CAAM,CACT,CACF,CCiBO,SAASK,GACdC,CAAAA,CAC0B,CAC1B,OAAOxB,CAAAA,CACJqB,IACCvB,eAAAA,CACE0B,CAAAA,CACA,yDACF,CAAA,CAEOC,oBAAAA,CAAgBD,CAAAA,CAAcH,CAAO,CAAA,CAAE,IAC3CK,CAAAA,EACC,IAAId,CAAAA,CAAmB,IACrBe,8BAAyBH,CAAAA,CAAcH,CAAAA,CAASK,CAAI,CACtD,CACJ,CAAA,CAAA,CAEF,CAACF,CAAY,CACf,CACF,CAmCO,SAASI,EAAAA,CACdJ,EACyE,CACzE,GAAM,CAACF,CAAe,EAAIF,CAAAA,EAAyB,CAEnD,OAAOpB,CAAAA,CACJqB,IACCvB,eAAAA,CAAU0B,CAAAA,CAAc,+CAA+C,CAAA,CAEhEF,CAAAA,CAAgBD,CAAO,CAAA,CAAE,OAAA,CAC9BQ,yBAAoBL,CAAY,CAClC,CAAA,CAAA,CAEF,CAACF,EAAiBE,CAAY,CAChC,CACF,CAwBO,SAASM,EAAAA,CACdN,CAAAA,CAKA,CACA,OAAOxB,CAAAA,CACJ+B,CAAAA,GACCjC,eAAAA,CACE0B,CAAAA,CACA,iDACF,CAAA,CAEOQ,0BAAAA,CAAsBR,CAAY,CAAA,CAAEO,CAAS,CAAA,CAAA,CAEtD,CAACP,CAAY,CACf,CACF,CCiKO,SAASS,CAAAA,CAAgB,CAC9B,QAAA,CAAApD,CAAAA,CAAW,MACX,KAAA,CAAAC,CAAAA,CAAQ,KAAA,CACR,GAAGuC,CACL,CAAA,CAGmD,CACjD,IAAMH,CAAAA,CAASD,GAAc,CAE7B,OAAOvC,CAAAA,CAAoB,CACzB,QAAA,CAAUwD,yBAAAA,CACV,SAAA,CAAW,CAAE,QAAAb,CAAQ,CAAA,CACrB,QAAA,CAAAxC,CAAAA,CACA,MAAAC,CAAAA,CACA,YAAA,CAAcuC,CAAAA,CAAQ,EAAA,CAClB,EACAH,CAAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,oBACjC,CAAC,CACH,CClSA,IAAMiB,EAAuB,MAAA,CAEvBC,EAAAA,CAAoD,CACxD,MAAA,CAAQ,QAAWD,CAAAA,CACnB,MAAA,CAAQ,OAAA,CACR,QAAA,CAAU,QACV,KAAA,CAAO,OAAA,CAAWA,CAAAA,CAClB,yBAAA,CAA2B,OAC7B,CAAA,CAEA,SAASE,EAAAA,CAAiBC,EAA+B,CACvD,IAAMC,CAAAA,CAAM,MAAA,CAAO,KAAKD,CAAM,CAAA,CAAE,CAAC,CAAA,CACjC,OAAOF,EAAAA,CAAaG,CAAG,CAAA,EAAKC,WAAAA,CAAM,CAAA,iCAAA,EAAoCD,CAAG,CAAA,CAAE,CAC7E,CAEA,SAASE,EAAAA,CAAiBH,CAAAA,CAAkC,CAC1D,OAAI,QAAA,GAAYA,CAAAA,CACPA,CAAAA,CAAO,MAAA,CAAO,QAGnB,QAAA,GAAYA,CAAAA,CACPA,CAAAA,CAAO,MAAA,CAAO,OAAA,CAGnB,UAAA,GAAcA,CAAAA,CACTA,CAAAA,CAAO,SAAS,OAAA,CAGrB,OAAA,GAAWA,CAAAA,CACNA,CAAAA,CAAO,KAAA,CAAM,OAAA,CAGlB,2BAAA,GAA+BA,CAAAA,CAC1BA,EAAO,yBAAA,CAA0B,OAAA,CAGnCE,WAAAA,CAAM,qBAAqB,CACpC,CAEA,SAASE,CAAAA,CAAaC,EAAuD,CAC3E,GAAI,UAAA,GAAcA,CAAAA,EAASA,EAAM,QAAA,CAC/B,OAAOA,CAAAA,CAAM,QAAA,CAAS,MAAM,OAAA,CAG9B,GAAI,UAAA,GAAcA,CAAAA,EAASA,CAAAA,CAAM,QAAA,CAAU,CACzC,IAAMC,EAAYH,EAAAA,CAAiBE,CAAAA,CAAM,QAAQ,CAAA,CAEjD,OAAOE,uBAAAA,CAAgBD,CAAS,CAAA,CAAE,OACpC,CAGF,CAEA,SAASE,EAAAA,CACPH,CAAAA,CACkB,CAClB,GAAI,UAAA,GAAcA,CAAAA,EAASA,EAAM,QAAA,CAC/B,OAAOA,CAAAA,CAAM,QAAA,CAAS,SAG1B,CAQA,SAASI,EAAAA,EAIP,CACA,IAAM7B,CAAAA,CAASD,CAAAA,EAAc,CAE7B,OAAOjB,CAAAA,CACJ2C,CAAAA,EAAU,CACT,IAAMK,EAAUC,iBAAAA,CAAYP,CAAAA,CAAaC,CAAK,CAAC,EACzCO,CAAAA,CAAeC,yBAAAA,CAAmB,CACtC,KAAA,CAAOC,qBAAgBJ,CAAO,CAAA,CAC1BI,oBAAAA,CAAgBJ,CAAO,CAAA,CACvBR,WAAAA,CAAM,CAAA,qCAAA,EAAwCQ,CAAO,EAAE,CAAA,CAC3D,SAAA,CAAWK,WAAAA,EACb,CAAC,CAAA,CAED,OAAI,UAAA,GAAcV,CAAAA,CACTW,kBAAY,WAAA,CACjBJ,CAAAA,CAAa,qBAAA,CAAsB,CAAE,IAAA,CAAMP,CAAAA,CAAM,QAAA,CAAS,MAAO,CAAC,CAAA,CACjElE,CAAAA,EAAUmB,sBAAAA,CAAgB,IAAA,CAAKnB,CAAK,CACvC,CAAA,CAAE,GAAA,CAAK8E,CAAAA,GACE,CACL,KAAA,CAAOZ,CAAAA,CAAM,QAAA,CAAS,KAAA,CACtB,QAAA,CAAUY,CAAAA,CAAQ,iBAAA,CAClB,QAAA,CAAUA,EAAQ,OACpB,CAAA,CACD,CAAA,CAGC,UAAA,GAAcZ,GAASA,CAAAA,CAAM,QAAA,CACxBW,iBAAAA,CAAY,OAAA,CAAQ,CACzBA,iBAAAA,CAAY,WAAA,CAAYJ,CAAAA,CAAa,kBAAA,EAAmB,CAAIzE,CAAAA,EAC1DmB,sBAAAA,CAAgB,IAAA,CAAKnB,CAAK,CAC5B,CAAA,CACA+E,aAAAA,CAAWtC,CAAAA,CAAQ,CAAE,OAAA,CAAA8B,CAAQ,CAAC,EAAE,GAAA,CAAIC,iBAAW,CACjD,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAE,YAAA,CAAAQ,CAAa,CAAA,CAAGC,CAAK,KACvB,CACL,KAAA,CAAAA,CAAAA,CACA,QAAA,CAAUD,EACV,QAAA,CAAUpB,EAAAA,CAAiBM,CAAAA,CAAM,QAAQ,CAC3C,CAAA,CACD,CAAA,CAGIgB,aAAAA,CAAQ,CACb,KAAA,CAAOnB,WAAAA,CAAM,gBAAgB,CAAA,CAC7B,SAAU,EAAA,CACV,QAAA,CAAU,EACZ,CAAC,CACH,CAAA,CACA,CAACtB,CAAM,CACT,CACF,CAEA,SAAS0C,CAAAA,CACPC,EACAC,CAAAA,CACc,CACd,IAAMC,CAAAA,CAAeF,EAAQ,QAAA,CAAWA,CAAAA,CAAQ,QAAA,CAC1CG,CAAAA,CAAUC,iBAAWF,CAAY,CAAA,CAAE,OAAA,CACvC,CAACF,CAAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,QAC5B,EAEMK,CAAAA,CAAwB,CAC5B,UAAA,CAAY,eAAA,CACZ,SAAUL,CAAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,QAAA,CACnC,aAAcE,CAAAA,CACd,KAAA,CAAOC,CACT,CAAA,CAEA,OAAO,CACL,UAAA,CAAY,cAAA,CACZ,MAAO,CACL,UAAA,CAAY,aAAA,CACZ,IAAA,CAAMH,EAAQ,KAAA,CAAM,UAAA,CACpB,KAAA,CAAOA,CAAAA,CAAQ,KACjB,CAAA,CACA,MAAA,CAAAK,CAAAA,CACA,UAAA,CAAY,CACV,UAAA,CAAY,YAAA,CACZ,KAAA,CAAOF,EAAQ,GAAA,CAAIF,CAAAA,CAAK,KAAK,CAAA,CAC7B,KAAMA,CAAAA,CAAK,IAAA,CACX,MAAA,CAAQA,CAAAA,CAAK,MACf,CAAA,CACA,QAAA,CAAU,CACR,UAAA,CAAY,eAAA,CACZ,QAAA,CAAU,CAAA,CACV,YAAA,CAAc,OAAOA,CAAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAE,OAAA,CAAQ,CAAA,CAAGK,kBAAAA,CAAa,IAAI,CAAC,CAAA,CACxE,KAAA,CAAOL,CAAAA,CAAK,KACd,CACF,CACF,CAOO,IAAMM,GAAgC,CAAC,CAC5C,KAAA,CAAAzB,CAAAA,CACA,SAAA0B,CAAAA,CAAWC,gBAAAA,CAAS,GAAA,CACpB,KAAA,CAAAxF,EAAQ,KAAA,CACR,QAAA,CAAAD,CAAAA,CAAW,KACb,CAAA,GAKwD,CACtD,GAAM,CAAC0F,EAAcV,CAAO,CAAA,CAAId,EAAAA,EAAoB,CAE9Ce,EAAO7B,CAAAA,CAAgB,CAC3B,IAAA,CAAM,CACJ,OAAQS,CAAAA,CAAaC,CAAK,CAC5B,CAAA,CACA,EAAA,CAAI0B,CAAAA,CACJ,EAAA,CAAIvB,EAAAA,CAAoCH,CAAK,CAAA,CAC7C,KAAA,CAAA7D,CAAAA,CACA,GAAID,EAAW,CAAE,QAAA,CAAAA,CAAS,CAAA,CAAI,EAChC,CAAC,CAAA,CASD,OANAa,WAAAA,CAAU,IAAM,CACVZ,CAAAA,EAAS+E,EAAQ,MAAA,EAAU,CAAClB,CAAAA,EAEhC4B,CAAAA,CAAa5B,CAAK,EACpB,CAAA,CAAG,CAAC4B,CAAAA,CAAczF,EAAO+E,CAAAA,CAAQ,MAAM,CAAC,CAAA,CAEpCC,CAAAA,CAAK,MAAA,CACAvF,CAAAA,CAAW,MAAA,CAChBsF,EAAQ,IAAA,EAAQC,CAAAA,CAAK,IAAA,CACjBF,CAAAA,CAAuBC,EAAQ,IAAA,CAAMC,CAAAA,CAAK,IAAI,CAAA,CAC9C,OACJA,CAAAA,CAAK,KAAA,CAAQA,CAAAA,CAAK,KAAA,CAAQ,MAC5B,CAAA,CAGE,CAACD,CAAAA,CAAQ,QAAUA,CAAAA,CAAQ,OAAA,EAAWC,CAAAA,CAAK,OAAA,CACtCvF,EAAW,OAAA,EAAQ,CAGxBsF,CAAAA,CAAQ,KAAA,EAASC,EAAK,KAAA,CACjBvF,CAAAA,CAAW,OAAA,CAChBsF,CAAAA,CAAQ,KAAA,EAASC,CAAAA,CAAK,KAAA,EAAStB,WAAAA,CAAM,eAAe,CACtD,CAAA,EAGF1C,eAAAA,CACE+D,CAAAA,CAAQ,MAAQC,CAAAA,CAAK,IAAA,CACrB,wCACF,CAAA,CAEOvF,EAAW,OAAA,CAAQqF,CAAAA,CAAuBC,CAAAA,CAAQ,IAAA,CAAMC,CAAAA,CAAK,IAAI,CAAC,CAAA,CAC3E,EC3PO,IAAMV,EAAAA,CAAuC,MAAA,CAAO,MAAA,CACzDoB,oBACF,EAMO,SAASC,EAAAA,EAA0C,CACxD,OAAOrB,EACT","file":"index.cjs","sourcesContent":["import type { UnexpectedError } from '@aave/client';\n\n/**\n * A read hook result.\n *\n * It's a discriminated union of the possible results of a read operation:\n * - Rely on the `loading` value to determine if the `data` or `error` can be evaluated.\n * - If `error` is `undefined`, then `data` value will be available.\n */\nexport type ReadResult<T, E extends UnexpectedError = UnexpectedError> =\n | {\n data: undefined;\n error: undefined;\n loading: true;\n }\n | {\n data: T;\n error: undefined;\n loading: false;\n }\n | {\n data: undefined;\n error: E;\n loading: false;\n };\n\n/**\n * A read hook result that supports pausing.\n */\nexport type PausableReadResult<T, E extends UnexpectedError = UnexpectedError> =\n | {\n data: T | undefined;\n error: E | undefined;\n loading: false;\n paused: true;\n }\n | {\n data: undefined;\n error: undefined;\n loading: true;\n paused: false;\n }\n | {\n data: T;\n error: undefined;\n loading: false;\n paused: false;\n }\n | {\n data: undefined;\n error: E;\n loading: false;\n paused: false;\n };\n\n/**\n * @internal\n */\nexport const ReadResult = {\n Loading: <\n T,\n E extends UnexpectedError = UnexpectedError,\n >(): PausableReadResult<T, E> => ({\n data: undefined,\n error: undefined,\n loading: true,\n paused: false,\n }),\n Success: <T, E extends UnexpectedError = UnexpectedError>(\n data: T,\n ): PausableReadResult<T, E> => ({\n data,\n error: undefined,\n loading: false,\n paused: false,\n }),\n Failure: <T, E extends UnexpectedError = UnexpectedError>(\n error: E,\n ): PausableReadResult<T, E> => ({\n data: undefined,\n error,\n loading: false,\n paused: false,\n }),\n Paused: <T, E extends UnexpectedError = UnexpectedError>(\n data: T | undefined,\n error: E | undefined,\n ): PausableReadResult<T, E> => ({\n data,\n error,\n loading: false,\n paused: true,\n }),\n};\n\n/**\n * A read hook result that supports React Suspense.\n */\nexport type SuspenseResult<T> = {\n data: T;\n};\n\n/**\n * A read hook result that supports React Suspense and can be paused.\n */\nexport type PausableSuspenseResult<T> =\n | {\n paused: true;\n data: undefined;\n }\n | {\n paused: false;\n data: T;\n };\n\nexport type SuspendableResult<T, E extends UnexpectedError = UnexpectedError> =\n | ReadResult<T, E>\n | SuspenseResult<T>\n | PausableReadResult<T, E>\n | PausableSuspenseResult<T>;\n","import { type StandardData, UnexpectedError } from '@aave/client';\nimport {\n type AnyVariables,\n identity,\n invariant,\n type NullishDeep,\n type Prettify,\n} from '@aave/types';\nimport { useEffect, useMemo, useState } from 'react';\nimport { type TypedDocumentNode, useQuery } from 'urql';\nimport {\n type PausableReadResult,\n type PausableSuspenseResult,\n ReadResult,\n type SuspendableResult,\n type SuspenseResult,\n} from './results';\n\nexport type Selector<T, V> = (data: T) => V;\n\nexport type Pausable<T, WhenPaused = NullishDeep<T>> = Prettify<\n WhenPaused & {\n /**\n * Prevents the hook from automatically executing GraphQL query operations.\n *\n * @experimental This is an experimental feature and may change in the future.\n *\n * @remarks\n * `pause` may be set to `true` to stop the query operation from executing\n * automatically. The hook will stop receiving updates and won’t execute the query\n * operation until it’s set to `false`.\n */\n pause: boolean;\n }\n>;\n\nexport type Suspendable = { suspense: true };\n\n/**\n * @internal\n */\nexport type UseSuspendableQueryArgs<\n Value,\n Output,\n Variables extends AnyVariables,\n Suspense extends boolean,\n Pause extends boolean = never,\n> = {\n document: TypedDocumentNode<StandardData<Value>, Variables>;\n variables?: Pause extends boolean ? NullishDeep<Variables> : Variables;\n suspense: Suspense;\n selector?: Selector<Value, Output>;\n pollInterval?: number;\n batch?: boolean;\n pause?: Pause;\n};\n\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<Value, Output, Variables, false, Pausable>):\n | ReadResult<Output>\n | PausableReadResult<Output>;\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<Value, Output, Variables, true, Pausable>):\n | SuspenseResult<Output>\n | PausableSuspenseResult<Output>;\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<\n Value,\n Output,\n Variables,\n boolean,\n Pausable\n>): SuspendableResult<Output, UnexpectedError>;\n/**\n * Implementation.\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n>({\n document,\n variables,\n suspense,\n pause,\n selector = identity as Selector<Value, Output>,\n pollInterval = 0,\n batch = true,\n}: UseSuspendableQueryArgs<\n Value,\n Output,\n Variables,\n boolean,\n boolean\n>): SuspendableResult<Output, UnexpectedError> {\n const [loading, setLoading] = useState(true);\n const [{ fetching, data, error }, executeQuery] = useQuery({\n query: document,\n variables: variables as Variables,\n pause,\n context: useMemo(\n () => ({\n batch,\n suspense,\n }),\n [batch, suspense],\n ),\n });\n\n useEffect(() => {\n if (pause) return;\n\n if (!fetching) {\n setLoading(false);\n }\n }, [fetching, pause]);\n\n useEffect(() => {\n if (pollInterval <= 0 || fetching || pause) return undefined;\n\n const timerId = setTimeout(() => {\n executeQuery({\n requestPolicy: 'network-only',\n batch: false, // never batch, run now!\n });\n }, pollInterval);\n\n return () => clearTimeout(timerId);\n }, [fetching, executeQuery, pollInterval, pause]);\n\n if (pause) {\n return ReadResult.Paused(\n data ? selector(data.value) : undefined,\n error ? UnexpectedError.from(error) : undefined,\n );\n }\n\n if (!suspense && loading) {\n return ReadResult.Loading();\n }\n\n if (error) {\n const unexpected = UnexpectedError.from(error);\n if (suspense) {\n throw unexpected;\n }\n\n return ReadResult.Failure(unexpected);\n }\n\n invariant(data, 'No data returned');\n\n return ReadResult.Success(selector(data.value));\n}\n","import { invariant, type ResultAsync } from '@aave/types';\nimport { type DependencyList, useCallback, useRef, useState } from 'react';\n\n/**\n * An async task is a function that can be executed multiple times and that can be in a pending state.\n *\n * @internal\n */\nexport type AsyncTask<TInput, TResult extends ResultAsync<unknown, unknown>> = (\n input: TInput,\n) => TResult;\n\n/**\n * The initial state of a async task.\n */\nexport type AsyncTaskIdle = {\n called: boolean;\n loading: false;\n data: undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task during the loading.\n */\nexport type AsyncTaskLoading<TData> = {\n called: true;\n loading: true;\n data: TData | undefined;\n error: undefined;\n};\n\n/**\n * The state of a async task after a successful call.\n */\nexport type AsyncTaskSuccess<TData> = {\n called: true;\n loading: false;\n data: TData;\n error: undefined;\n};\n\n/**\n * The state of a async task after a failed call.\n */\nexport type AsyncTaskError<TError> = {\n called: true;\n loading: false;\n data: undefined;\n error: TError;\n};\n\n/**\n * The possible statuses of a async task.\n */\nexport type AsyncTaskState<TData, TError> =\n | AsyncTaskIdle\n | AsyncTaskLoading<TData>\n | AsyncTaskSuccess<TData>\n | AsyncTaskError<TError>;\n\nconst AsyncTaskState = {\n Idle: <TData, TError>(): AsyncTaskState<TData, TError> => ({\n called: false,\n loading: false,\n data: undefined,\n error: undefined,\n }),\n Loading: <TData, TError>(data?: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: true,\n data,\n error: undefined,\n }),\n Success: <TData, TError>(data: TData): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data,\n error: undefined,\n }),\n Failed: <TData, TError>(error: TError): AsyncTaskState<TData, TError> => ({\n called: true,\n loading: false,\n data: undefined,\n error,\n }),\n};\n\n/**\n * A async task React Hook is a lightweight wrapper for an asynchronous function.\n * It allows tracking of the task's execution status and provides access to the\n * last error that occurred during the task's execution, if any.\n *\n * ```ts\n * const [execute, { called, loading, data, error }]: UseAsyncTask<TData, TError, TInput> = useAnyAsyncTask();\n *\n * if (!called) {\n * // data === undefined\n * // error === undefined\n * return <p>Click the button to execute the task</p>;\n * }\n *\n * if (loading) {\n * // data === undefined on first call\n * // data === TData from previous successful call\n * // error === undefined\n * return <Loader />;\n * }\n *\n * if (error) {\n * // data === undefined\n * // error === TError\n * return <p>Something went wrong: {error.message}</p>;\n * }\n *\n * // called === true\n * // data === TData\n * // error === undefined\n * return <p>Task completed: {data}</p>;\n * ```\n */\nexport type UseAsyncTask<TInput, TValue, TError> = [\n AsyncTask<TInput, ResultAsync<TValue, TError>>,\n AsyncTaskState<TValue, TError>,\n];\n\n/**\n * @internal\n */\nexport function useAsyncTask<\n TInput,\n TValue,\n TError,\n TResult extends ResultAsync<TValue, TError>,\n>(\n handler: AsyncTask<TInput, TResult>,\n deps: DependencyList,\n): UseAsyncTask<TInput, TValue, TError> {\n const [state, setState] = useState(AsyncTaskState.Idle<TValue, TError>());\n const loadingRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: useAsyncTask is a low-level hook\n const handle = useCallback(handler, deps);\n\n const execute = useCallback(\n (input: TInput) => {\n invariant(\n !loadingRef.current,\n 'Cannot execute a task while another is in progress.',\n );\n\n loadingRef.current = true;\n setState(({ data }) => {\n return {\n called: true,\n loading: true,\n data,\n error: undefined,\n };\n });\n\n const result = handle(input);\n\n result.match(\n (value) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Success(value));\n },\n (error) => {\n loadingRef.current = false;\n setState(AsyncTaskState.Failed(error));\n },\n );\n\n return result;\n },\n [handle],\n );\n\n return [execute, state];\n}\n","import type { TransactionResult } from '@aave/client';\nimport {\n CancelError,\n type SigningError,\n type TimeoutError,\n type TransactionError,\n type UnexpectedError,\n} from '@aave/core';\nimport type {\n Erc20ApprovalRequired,\n PreContractActionRequired,\n TransactionRequest,\n} from '@aave/graphql';\nimport type { ResultAsync } from '@aave/types';\nimport { invariant } from '@aave/types';\nimport type { UseAsyncTask } from './tasks';\n\n/**\n * The errors that could occur in the early stage of sending a transaction.\n */\nexport type SendTransactionError = CancelError | SigningError | UnexpectedError;\n\nexport type CancelOperation = (\n message: string,\n) => ResultAsync<never, CancelError>;\n\n/**\n * @internal\n */\nexport const cancel: CancelOperation = (message: string) =>\n CancelError.from(message).asResultAsync();\n\nexport type TransactionHandlerOptions = {\n cancel: CancelOperation;\n};\n\n/**\n * The errors that could occur in the late stages of a transaction.\n */\nexport type PendingTransactionError =\n | CancelError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\nexport class PendingTransaction {\n constructor(\n /**\n * @internal Do NOT rely on this method. It's used internally by the SDK and may be subject to breaking changes.\n */\n public readonly wait: () => ResultAsync<\n TransactionResult,\n PendingTransactionError\n >,\n ) {}\n\n /**\n * @internal\n */\n static ensure<T>(value: T): PendingTransaction & T {\n invariant(\n value instanceof PendingTransaction,\n 'Expected PendingTransaction',\n );\n return value as PendingTransaction & T;\n }\n}\n\nexport type UseSendTransactionResult = UseAsyncTask<\n TransactionRequest,\n PendingTransaction,\n SendTransactionError\n>;\n\n/**\n * The handler for sending Aave transactions.\n */\nexport type TransactionHandler = (\n result:\n | TransactionRequest\n | Erc20ApprovalRequired\n | PreContractActionRequired,\n options: TransactionHandlerOptions,\n) => ResultAsync<PendingTransaction, SendTransactionError>;\n","import type { AaveClient } from '@aave/client';\nimport { invariant } from '@aave/types';\nimport React, { type ReactNode, useContext } from 'react';\nimport { Provider as UrqlProvider } from 'urql';\n\nconst AaveContext = React.createContext<AaveClient | null>(null);\n\n/**\n * @internal\n */\nexport type AaveContextProviderProps = {\n children: ReactNode;\n client: AaveClient;\n};\n\n/**\n * @internal\n */\nexport function AaveContextProvider({\n children,\n client,\n}: AaveContextProviderProps) {\n return (\n <AaveContext.Provider value={client}>\n <UrqlProvider value={client.urql}>{children}</UrqlProvider>\n </AaveContext.Provider>\n );\n}\n\n/**\n * @internal\n */\nexport function useAaveClient(): AaveClient {\n const client = useContext(AaveContext);\n\n invariant(\n client,\n 'Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>',\n );\n\n return client;\n}\n","import type { UnexpectedError } from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport type { PermitRequest, PermitTypedDataResponse } from '@aave/graphql';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers';\n\n/**\n * @internal\n */\nexport function usePermitTypedDataAction(): UseAsyncTask<\n PermitRequest,\n PermitTypedDataResponse,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: PermitRequest) => permitTypedData(client, request),\n [client],\n );\n}\n","import type { SigningError, UnexpectedError } from '@aave/client';\nimport {\n sendTransaction,\n signERC20PermitWith,\n signSwapTypedDataWith,\n waitForTransactionResult,\n} from '@aave/client/viem';\nimport type {\n ERC20PermitSignature,\n PermitRequest,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport { invariant } from '@aave/types';\nimport type { WalletClient } from 'viem';\n\nimport {\n PendingTransaction,\n type UseAsyncTask,\n type UseSendTransactionResult,\n useAsyncTask,\n} from '../helpers';\nimport { usePermitTypedDataAction } from '../permits';\n\n/**\n * A hook that provides a way to send Aave transactions using a viem WalletClient instance.\n *\n * Use the `useWalletClient` wagmi hook to get the `WalletClient` instance, then pass it to this hook to create a function that can be used to send transactions.\n *\n * ```ts\n * const { data: wallet } = useWalletClient(); // wagmi hook\n *\n * const [sendTransaction] = useSendTransaction(wallet);\n * ```\n *\n * @param walletClient - The wallet client to use for sending transactions.\n */\nexport function useSendTransaction(\n walletClient: WalletClient | undefined,\n): UseSendTransactionResult {\n return useAsyncTask(\n (request: TransactionRequest) => {\n invariant(\n walletClient,\n 'Expected a WalletClient to handle the operation result.',\n );\n\n return sendTransaction(walletClient, request).map(\n (hash) =>\n new PendingTransaction(() =>\n waitForTransactionResult(walletClient, request, hash),\n ),\n );\n },\n [walletClient],\n );\n}\n\nexport type SignERC20PermitError = SigningError | UnexpectedError;\n\n/**\n * A hook that provides a way to sign ERC20 permits using a viem WalletClient instance.\n *\n * ```ts\n * const { data: wallet } = useWalletClient(); // wagmi hook\n * const [signERC20Permit, { loading, error, data }] = useERC20Permit(wallet);\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * supply: {\n * sender: evmAddress(wallet.account.address), // User's address\n * reserve: {\n * reserveId: reserve.id,\n * chainId: reserve.chain.chainId,\n * spoke: reserve.spoke.address,\n * },\n * amount: {\n * value: bigDecimal(42), // 42 USDC\n * },\n * },\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 Permit signature:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(\n walletClient: WalletClient | undefined,\n): UseAsyncTask<PermitRequest, ERC20PermitSignature, SignERC20PermitError> {\n const [permitTypedData] = usePermitTypedDataAction();\n\n return useAsyncTask(\n (request: PermitRequest) => {\n invariant(walletClient, 'Expected a WalletClient to sign ERC20 permits');\n\n return permitTypedData(request).andThen(\n signERC20PermitWith(walletClient),\n );\n },\n [permitTypedData, walletClient],\n );\n}\n\nexport type SignSwapTypedDataError = SigningError | UnexpectedError;\n\n/**\n * @internal\n * A hook that provides a way to sign swap typed data using a viem WalletClient instance.\n *\n * ```ts\n * const { data: wallet } = useWalletClient(); // wagmi hook\n * const [signSwapTypedData, { loading, error, data }] = useSignSwapTypedDataWith(wallet);\n *\n * const run = async () => {\n * const result = await signSwapTypedData(swapTypedData);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Swap typed data signed:', result.value);\n * };\n * ```\n */\nexport function useSignSwapTypedDataWith(\n walletClient: WalletClient | undefined,\n): UseAsyncTask<\n SwapByIntentTypedData,\n ERC20PermitSignature,\n SignSwapTypedDataError\n> {\n return useAsyncTask(\n (typedData: SwapByIntentTypedData) => {\n invariant(\n walletClient,\n 'Expected a WalletClient to sign swap typed data',\n );\n\n return signSwapTypedDataWith(walletClient)(typedData);\n },\n [walletClient],\n );\n}\n","import type { CurrencyQueryOptions } from '@aave/client';\nimport { exchangeRate } from '@aave/client/actions';\nimport type { UnexpectedError } from '@aave/core';\nimport type { Chain, ExchangeRateRequest, FiatAmount } from '@aave/graphql';\nimport {\n type ActivityItem,\n ChainQuery,\n type ChainRequest,\n ChainsFilter,\n ChainsQuery,\n ExchangeRateQuery,\n type NativeAmount,\n type PreviewAction,\n} from '@aave/graphql';\nimport type { NullishDeep, Prettify } from '@aave/types';\nimport { useAaveClient } from './context';\nimport {\n type Pausable,\n type PausableReadResult,\n type PausableSuspenseResult,\n type ReadResult,\n type Suspendable,\n type SuspendableResult,\n type SuspenseResult,\n useSuspendableQuery,\n} from './helpers';\nimport { type UseAsyncTask, useAsyncTask } from './helpers/tasks';\n\nexport type UseChainArgs = ChainRequest;\n\n/**\n * Fetch a specific chain by chain ID.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useChain({\n * chainId: chainId(1),\n * suspense: true,\n * });\n * // data will be Chain | null\n * ```\n */\nexport function useChain(\n args: UseChainArgs & Suspendable,\n): SuspenseResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useChain({\n * chainId: chainId(1),\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useChain(\n args: Pausable<UseChainArgs> & Suspendable,\n): PausableSuspenseResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * ```tsx\n * const { data, error, loading } = useChain({\n * chainId: chainId(1),\n * });\n * // data will be Chain | null\n * ```\n */\nexport function useChain(args: UseChainArgs): ReadResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useChain({\n * chainId: chainId(1),\n * pause: true,\n * });\n * ```\n */\nexport function useChain(\n args: Pausable<UseChainArgs>,\n): PausableReadResult<Chain | null>;\n\nexport function useChain({\n suspense = false,\n pause = false,\n ...request\n}: NullishDeep<UseChainArgs> & {\n suspense?: boolean;\n pause?: boolean;\n}): SuspendableResult<Chain | null, UnexpectedError> {\n return useSuspendableQuery({\n document: ChainQuery,\n variables: {\n request,\n },\n suspense,\n pause,\n });\n}\n\nexport type UseChainsArgs = {\n filter: ChainsFilter;\n};\n/**\n * Fetches the list of supported chains.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useChains({\n * filter: ChainsFilter.ALL,\n * suspense: true,\n * });\n * ```\n */\nexport function useChains(\n args: UseChainsArgs & Suspendable,\n): SuspenseResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useChains({\n * filter: ChainsFilter.ALL,\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useChains(\n args: Pausable<UseChainsArgs> & Suspendable,\n): PausableSuspenseResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * ```tsx\n * const { data, error, loading } = useChains({\n * filter: ChainsFilter.ALL,\n * });\n * ```\n */\nexport function useChains(args?: UseChainsArgs): ReadResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useChains({\n * filter: ChainsFilter.ALL,\n * pause: true,\n * });\n * ```\n */\nexport function useChains(\n args?: Pausable<UseChainsArgs>,\n): PausableReadResult<Chain[]>;\n\nexport function useChains(\n {\n suspense = false,\n pause = false,\n filter,\n }: NullishDeep<UseChainsArgs> & {\n suspense?: boolean;\n pause?: boolean;\n } = { filter: ChainsFilter.ALL },\n): SuspendableResult<Chain[], UnexpectedError> {\n return useSuspendableQuery({\n document: ChainsQuery,\n variables: { filter },\n suspense,\n pause,\n });\n}\n\n/**\n * Fetches exchange rates between tokens and fiat currencies.\n *\n * ```tsx\n * const [getExchangeRate, gettingRate] = useExchangeRateAction();\n *\n * const loading = gettingRate.loading;\n * const error = gettingRate.error;\n *\n * // …\n *\n * const result = await getExchangeRate({\n * from: { erc20: { chainId: chainId(1), address: evmAddress('0xA0b86a33E6...') } },\n * to: Currency.Usd,\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Exchange rate:', result.value);\n * ```\n */\nexport function useExchangeRateAction(): UseAsyncTask<\n ExchangeRateRequest,\n FiatAmount,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: ExchangeRateRequest) => exchangeRate(client, request),\n [client],\n );\n}\n\nexport type UseExchangeRateArgs = ExchangeRateRequest;\n\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * suspense: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: UseExchangeRateArgs & Suspendable,\n): SuspenseResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: Pausable<UseExchangeRateArgs> & Suspendable,\n): PausableSuspenseResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * ```tsx\n * const { data, error, loading } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * });\n *\n * <Component value={somewhere} fxRate={data} />\n * ```\n */\nexport function useExchangeRate(\n args: UseExchangeRateArgs,\n): ReadResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * pause: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: Pausable<UseExchangeRateArgs>,\n): PausableReadResult<FiatAmount>;\n\nexport function useExchangeRate({\n suspense = false,\n pause = false,\n ...request\n}: NullishDeep<UseExchangeRateArgs> & {\n suspense?: boolean;\n pause?: boolean;\n}): SuspendableResult<FiatAmount, UnexpectedError> {\n const client = useAaveClient();\n\n return useSuspendableQuery({\n document: ExchangeRateQuery,\n variables: { request },\n suspense,\n pause,\n pollInterval: request.at\n ? 0\n : client.context.environment.exchangeRateInterval,\n });\n}\n\nexport type UseNetworkFeeRequestQuery =\n | {\n activity: ActivityItem;\n }\n | {\n estimate: PreviewAction;\n };\n\nexport type UseNetworkFeeArgs = Prettify<\n {\n query: UseNetworkFeeRequestQuery;\n } & CurrencyQueryOptions\n>;\n\ntype PausableUseNetworkFeeArgs = Partial<\n {\n query: Partial<UseNetworkFeeRequestQuery>;\n } & CurrencyQueryOptions\n>;\n\n/**\n * Fetch the network fee for an ActivityItem.\n *\n * @experimental This hook is experimental and may be subject to breaking changes.\n */\nexport type UseNetworkFee<T extends NativeAmount = NativeAmount> =\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useNetworkFee({\n * query: { activity },\n * suspense: true,\n * });\n *\n * data: NativeAmount\n * ```\n */\n ((args: UseNetworkFeeArgs & Suspendable) => SuspenseResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data, paused } = useNetworkFee({\n * query: { activity },\n * suspense: true,\n * pause: true,\n * });\n *\n * data: NativeAmount | undefined\n * ```\n */\n ((\n args: Pausable<UseNetworkFeeArgs, PausableUseNetworkFeeArgs> &\n Suspendable,\n ) => PausableSuspenseResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * ```tsx\n * const { data, error, loading } = useNetworkFee({\n * query: { activity },\n * });\n * ```\n */\n ((args: UseNetworkFeeArgs) => ReadResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useNetworkFee({\n * query: { activity },\n * pause: true,\n * });\n *\n * data: NativeAmount | undefined\n * ```\n */\n ((\n args: Pausable<UseNetworkFeeArgs, PausableUseNetworkFeeArgs>,\n ) => PausableReadResult<T>);\n","import { UnexpectedError } from '@aave/client';\nimport { chain as fetchChain } from '@aave/client/actions';\nimport { supportedChains } from '@aave/client/viem';\nimport {\n type Chain,\n Currency,\n type DecimalNumber,\n decodeReserveId,\n type FiatAmount,\n type NativeAmount,\n type PreviewAction,\n type ReserveId,\n} from '@aave/graphql';\nimport {\n bigDecimal,\n type ChainId,\n invariant,\n never,\n nonNullable,\n okAsync,\n ResultAsync,\n RoundingMode,\n} from '@aave/types';\nimport { useEffect } from 'react';\nimport { createPublicClient, http } from 'viem';\nimport { useAaveClient } from '../context';\nimport {\n ReadResult,\n type SuspendableResult,\n type UseAsyncTask,\n useAsyncTask,\n} from '../helpers';\nimport {\n type UseNetworkFee,\n type UseNetworkFeeRequestQuery,\n useExchangeRate,\n} from '../misc';\n\nconst estimatedApprovalGas = 55_558n;\n\nconst gasEstimates: Record<keyof PreviewAction, bigint> = {\n supply: 132_136n + estimatedApprovalGas,\n borrow: 250_551n,\n withdraw: 195_049n,\n repay: 217_889n + estimatedApprovalGas,\n setUserSupplyAsCollateral: 240_284n,\n};\n\nfunction inferGasEstimate(action: PreviewAction): bigint {\n const key = Object.keys(action)[0] as keyof PreviewAction;\n return gasEstimates[key] ?? never(`Expected gas estimate for action ${key}`);\n}\n\nfunction extractReserveId(action: PreviewAction): ReserveId {\n if ('supply' in action) {\n return action.supply.reserve;\n }\n\n if ('borrow' in action) {\n return action.borrow.reserve;\n }\n\n if ('withdraw' in action) {\n return action.withdraw.reserve;\n }\n\n if ('repay' in action) {\n return action.repay.reserve;\n }\n\n if ('setUserSupplyAsCollateral' in action) {\n return action.setUserSupplyAsCollateral.reserve;\n }\n\n return never('Expected reserve id');\n}\n\nfunction inferChainId(query: UseNetworkFeeRequestQuery): ChainId | undefined {\n if ('activity' in query && query.activity) {\n return query.activity.chain.chainId;\n }\n\n if ('estimate' in query && query.estimate) {\n const reserveId = extractReserveId(query.estimate);\n\n return decodeReserveId(reserveId).chainId;\n }\n\n return undefined;\n}\n\nfunction inferTimestampForExchangeRateLookup(\n query: UseNetworkFeeRequestQuery,\n): Date | undefined {\n if ('activity' in query && query.activity) {\n return query.activity.timestamp;\n }\n return undefined; // i.e., now\n}\n\ntype ExecutionDetails = {\n chain: Chain;\n gasPrice: bigint;\n gasUnits: bigint;\n};\n\nfunction useExecutionDetails(): UseAsyncTask<\n UseNetworkFeeRequestQuery,\n ExecutionDetails,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (query) => {\n const chainId = nonNullable(inferChainId(query));\n const publicClient = createPublicClient({\n chain: supportedChains[chainId]\n ? supportedChains[chainId]\n : never(`Expected supported chain for chainId ${chainId}`),\n transport: http(),\n });\n\n if ('activity' in query) {\n return ResultAsync.fromPromise(\n publicClient.getTransactionReceipt({ hash: query.activity.txHash }),\n (error) => UnexpectedError.from(error),\n ).map((receipt) => {\n return {\n chain: query.activity.chain,\n gasPrice: receipt.effectiveGasPrice,\n gasUnits: receipt.gasUsed,\n };\n });\n }\n\n if ('estimate' in query && query.estimate) {\n return ResultAsync.combine([\n ResultAsync.fromPromise(publicClient.estimateFeesPerGas(), (error) =>\n UnexpectedError.from(error),\n ),\n fetchChain(client, { chainId }).map(nonNullable),\n ]).map(([{ maxFeePerGas }, chain]) => {\n return {\n chain,\n gasPrice: maxFeePerGas,\n gasUnits: inferGasEstimate(query.estimate),\n };\n });\n }\n\n return okAsync({\n chain: never('Expected chain'),\n gasPrice: 0n,\n gasUnits: 0n,\n });\n },\n [client],\n );\n}\n\nfunction createNetworkFeeAmount(\n details: ExecutionDetails,\n rate: FiatAmount,\n): NativeAmount {\n const gasCostInWei = details.gasPrice * details.gasUnits;\n const gasCost = bigDecimal(gasCostInWei).rescale(\n -details.chain.nativeInfo.decimals,\n );\n\n const amount: DecimalNumber = {\n __typename: 'DecimalNumber',\n decimals: details.chain.nativeInfo.decimals,\n onChainValue: gasCostInWei,\n value: gasCost,\n };\n\n return {\n __typename: 'NativeAmount',\n token: {\n __typename: 'NativeToken',\n info: details.chain.nativeInfo,\n chain: details.chain,\n },\n amount,\n fiatAmount: {\n __typename: 'FiatAmount',\n value: gasCost.mul(rate.value),\n name: rate.name,\n symbol: rate.symbol,\n },\n fiatRate: {\n __typename: 'DecimalNumber',\n decimals: 2,\n onChainValue: BigInt(rate.value.rescale(2).toFixed(0, RoundingMode.Down)),\n value: rate.value,\n },\n };\n}\n\n/**\n * Fetch the network fee for an ActivityItem or estimates networkf feed for a preview action.\n *\n * @experimental This hook is experimental and may be subject to breaking changes.\n */\nexport const useNetworkFee: UseNetworkFee = (({\n query,\n currency = Currency.Usd,\n pause = false,\n suspense = false,\n}: {\n query: UseNetworkFeeRequestQuery;\n currency?: Currency;\n pause?: boolean;\n suspense?: boolean;\n}): SuspendableResult<NativeAmount, UnexpectedError> => {\n const [fetchDetails, details] = useExecutionDetails();\n\n const rate = useExchangeRate({\n from: {\n native: inferChainId(query),\n },\n to: currency,\n at: inferTimestampForExchangeRateLookup(query),\n pause,\n ...(suspense ? { suspense } : {}),\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: query omitted since it's usually a literal object that changes at every render\n useEffect(() => {\n if (pause || details.called || !query) return;\n\n fetchDetails(query);\n }, [fetchDetails, pause, details.called]);\n\n if (rate.paused) {\n return ReadResult.Paused(\n details.data && rate.data\n ? createNetworkFeeAmount(details.data, rate.data)\n : undefined,\n rate.error ? rate.error : undefined,\n );\n }\n\n if (!details.called || details.loading || rate.loading) {\n return ReadResult.Loading();\n }\n\n if (details.error || rate.error) {\n return ReadResult.Failure(\n details.error ?? rate.error ?? never('Unknown error'),\n );\n }\n\n invariant(\n details.data && rate.data,\n 'Expected receipt, chain, and rate data',\n );\n\n return ReadResult.Success(createNetworkFeeAmount(details.data, rate.data));\n}) as UseNetworkFee;\n","import { supportedChains as supportedChainsMap } from '@aave/client/viem';\nimport type { Chain } from 'viem';\n\nexport * from './adapters';\nexport * from './useNetworkFee';\n\n/**\n * The list of supported chains typically used with wagmi config.\n */\nexport const supportedChains: [Chain, ...Chain[]] = Object.values(\n supportedChainsMap,\n) as [Chain, ...Chain[]];\n/**\n * A hook that provides a way to get the list of supported chains using viem.\n *\n * @returns The list of supported chains using viem.\n */\nexport function useSupportedChains(): [Chain, ...Chain[]] {\n return supportedChains;\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {f as f$1,a as a$1}from'../chunk-XIDOSID3.js';import {a,c,f,e}from'../chunk-GTUQRT5Q.js';import {supportedChains,sendTransaction,waitForTransactionResult,signERC20PermitWith,signSwapTypedDataWith}from'@aave/client/viem';import {invariant,never,nonNullable,ResultAsync,okAsync,bigDecimal,RoundingMode}from'@aave/types';import {UnexpectedError}from'@aave/client';import {chain}from'@aave/client/actions';import {Currency,decodeReserveId}from'@aave/graphql';import {useEffect}from'react';import {createPublicClient,http}from'viem';function z(e){return a(t=>(invariant(e,"Expected a WalletClient to handle the operation result."),sendTransaction(e,t).map(r=>new c(()=>waitForTransactionResult(e,t,r)))),[e])}function J(e){let[t]=f();return a(r=>(invariant(e,"Expected a WalletClient to sign ERC20 permits"),t(r).andThen(signERC20PermitWith(e))),[t,e])}function K(e){return a(t=>(invariant(e,"Expected a WalletClient to sign swap typed data"),signSwapTypedDataWith(e)(t)),[e])}var C=55558n,W={supply:132136n+C,borrow:250551n,withdraw:195049n,repay:217889n+C,setUserSupplyAsCollateral:240284n};function Q(e){let t=Object.keys(e)[0];return W[t]??never(`Expected gas estimate for action ${t}`)}function B(e){return "supply"in e?e.supply.reserve:"borrow"in e?e.borrow.reserve:"withdraw"in e?e.withdraw.reserve:"repay"in e?e.repay.reserve:"setUserSupplyAsCollateral"in e?e.setUserSupplyAsCollateral.reserve:never("Expected reserve id")}function R(e){if("activity"in e&&e.activity)return e.activity.chain.chainId;if("estimate"in e&&e.estimate){let t=B(e.estimate);return decodeReserveId(t).chainId}}function G(e){if("activity"in e&&e.activity)return e.activity.timestamp}function j(){let e$1=e();return a(t=>{let r=nonNullable(R(t)),s=createPublicClient({chain:supportedChains[r]?supportedChains[r]:never(`Expected supported chain for chainId ${r}`),transport:http()});return "activity"in t?ResultAsync.fromPromise(s.getTransactionReceipt({hash:t.activity.txHash}),n=>UnexpectedError.from(n)).map(n=>({chain:t.activity.chain,gasPrice:n.effectiveGasPrice,gasUnits:n.gasUsed})):"estimate"in t&&t.estimate?ResultAsync.combine([ResultAsync.fromPromise(s.estimateFeesPerGas(),n=>UnexpectedError.from(n)),chain(e$1,{chainId:r}).map(nonNullable)]).map(([{maxFeePerGas:n},i])=>({chain:i,gasPrice:n,gasUnits:Q(t.estimate)})):okAsync({chain:never("Expected chain"),gasPrice:0n,gasUnits:0n})},[e$1])}function E(e,t){let r=e.gasPrice*e.gasUnits,s=bigDecimal(r).rescale(-e.chain.nativeInfo.decimals),n={__typename:"DecimalNumber",decimals:e.chain.nativeInfo.decimals,onChainValue:r,value:s};return {__typename:"NativeAmount",token:{__typename:"NativeToken",info:e.chain.nativeInfo,chain:e.chain},amount:n,fiatAmount:{__typename:"FiatAmount",value:s.mul(t.value),name:t.name,symbol:t.symbol},fiatRate:{__typename:"DecimalNumber",decimals:2,onChainValue:BigInt(t.value.rescale(2).toFixed(0,RoundingMode.Down)),value:t.value}}}var oe=({query:e,currency:t=Currency.Usd,pause:r=false,suspense:s=false})=>{let[n,i]=j(),a=f$1({from:{native:R(e)},to:t,at:G(e),pause:r,...s?{suspense:s}:{}});return useEffect(()=>{r||i.called||!e||n(e);},[n,r,i.called]),a.paused?a$1.Paused(i.data&&a.data?E(i.data,a.data):void 0,a.error?a.error:void 0):!i.called||i.loading||a.loading?a$1.Loading():i.error||a.error?a$1.Failure(i.error??a.error??never("Unknown error")):(invariant(i.data&&a.data,"Expected receipt, chain, and rate data"),a$1.Success(E(i.data,a.data)))};var M=Object.values(supportedChains);function ue(){return M}export{M as supportedChains,J as useERC20Permit,oe as useNetworkFee,z as useSendTransaction,K as useSignSwapTypedDataWith,ue as useSupportedChains};//# sourceMappingURL=index.js.map
1
+ import {f as f$1,a as a$1}from'../chunk-YJ6HF5HO.js';import {a,c,f,e}from'../chunk-GTUQRT5Q.js';import {supportedChains,sendTransaction,waitForTransactionResult,signERC20PermitWith,signSwapTypedDataWith}from'@aave/client/viem';import {invariant,never,nonNullable,ResultAsync,okAsync,bigDecimal,RoundingMode}from'@aave/types';import {UnexpectedError}from'@aave/client';import {chain}from'@aave/client/actions';import {Currency,decodeReserveId}from'@aave/graphql';import {useEffect}from'react';import {createPublicClient,http}from'viem';function z(e){return a(t=>(invariant(e,"Expected a WalletClient to handle the operation result."),sendTransaction(e,t).map(r=>new c(()=>waitForTransactionResult(e,t,r)))),[e])}function J(e){let[t]=f();return a(r=>(invariant(e,"Expected a WalletClient to sign ERC20 permits"),t(r).andThen(signERC20PermitWith(e))),[t,e])}function K(e){return a(t=>(invariant(e,"Expected a WalletClient to sign swap typed data"),signSwapTypedDataWith(e)(t)),[e])}var C=55558n,W={supply:132136n+C,borrow:250551n,withdraw:195049n,repay:217889n+C,setUserSupplyAsCollateral:240284n};function Q(e){let t=Object.keys(e)[0];return W[t]??never(`Expected gas estimate for action ${t}`)}function B(e){return "supply"in e?e.supply.reserve:"borrow"in e?e.borrow.reserve:"withdraw"in e?e.withdraw.reserve:"repay"in e?e.repay.reserve:"setUserSupplyAsCollateral"in e?e.setUserSupplyAsCollateral.reserve:never("Expected reserve id")}function R(e){if("activity"in e&&e.activity)return e.activity.chain.chainId;if("estimate"in e&&e.estimate){let t=B(e.estimate);return decodeReserveId(t).chainId}}function G(e){if("activity"in e&&e.activity)return e.activity.timestamp}function j(){let e$1=e();return a(t=>{let r=nonNullable(R(t)),s=createPublicClient({chain:supportedChains[r]?supportedChains[r]:never(`Expected supported chain for chainId ${r}`),transport:http()});return "activity"in t?ResultAsync.fromPromise(s.getTransactionReceipt({hash:t.activity.txHash}),n=>UnexpectedError.from(n)).map(n=>({chain:t.activity.chain,gasPrice:n.effectiveGasPrice,gasUnits:n.gasUsed})):"estimate"in t&&t.estimate?ResultAsync.combine([ResultAsync.fromPromise(s.estimateFeesPerGas(),n=>UnexpectedError.from(n)),chain(e$1,{chainId:r}).map(nonNullable)]).map(([{maxFeePerGas:n},i])=>({chain:i,gasPrice:n,gasUnits:Q(t.estimate)})):okAsync({chain:never("Expected chain"),gasPrice:0n,gasUnits:0n})},[e$1])}function E(e,t){let r=e.gasPrice*e.gasUnits,s=bigDecimal(r).rescale(-e.chain.nativeInfo.decimals),n={__typename:"DecimalNumber",decimals:e.chain.nativeInfo.decimals,onChainValue:r,value:s};return {__typename:"NativeAmount",token:{__typename:"NativeToken",info:e.chain.nativeInfo,chain:e.chain},amount:n,fiatAmount:{__typename:"FiatAmount",value:s.mul(t.value),name:t.name,symbol:t.symbol},fiatRate:{__typename:"DecimalNumber",decimals:2,onChainValue:BigInt(t.value.rescale(2).toFixed(0,RoundingMode.Down)),value:t.value}}}var oe=({query:e,currency:t=Currency.Usd,pause:r=false,suspense:s=false})=>{let[n,i]=j(),a=f$1({from:{native:R(e)},to:t,at:G(e),pause:r,...s?{suspense:s}:{}});return useEffect(()=>{r||i.called||!e||n(e);},[n,r,i.called]),a.paused?a$1.Paused(i.data&&a.data?E(i.data,a.data):void 0,a.error?a.error:void 0):!i.called||i.loading||a.loading?a$1.Loading():i.error||a.error?a$1.Failure(i.error??a.error??never("Unknown error")):(invariant(i.data&&a.data,"Expected receipt, chain, and rate data"),a$1.Success(E(i.data,a.data)))};var M=Object.values(supportedChains);function ue(){return M}export{M as supportedChains,J as useERC20Permit,oe as useNetworkFee,z as useSendTransaction,K as useSignSwapTypedDataWith,ue as useSupportedChains};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aave/react",
3
- "version": "4.0.0-next.2",
3
+ "version": "4.0.0-next.4",
4
4
  "description": "The official React bindings for the Aave Protocol",
5
5
  "keywords": [
6
6
  "aave",
@@ -72,10 +72,10 @@
72
72
  "sideEffects": false,
73
73
  "dependencies": {
74
74
  "urql": "^5.0.1",
75
- "@aave/client": "4.0.0-next.2",
76
- "@aave/core": "1.0.0-next.1",
77
- "@aave/types": "1.0.0-next.1",
78
- "@aave/graphql": "1.0.0-next.2"
75
+ "@aave/graphql": "1.0.0-next.4",
76
+ "@aave/types": "1.0.0-next.3",
77
+ "@aave/client": "4.0.0-next.4",
78
+ "@aave/core": "1.0.0-next.3"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@privy-io/react-auth": "^2.20.0",
@@ -120,7 +120,7 @@
120
120
  },
121
121
  "license": "MIT",
122
122
  "publishConfig": {
123
- "access": "restricted"
123
+ "access": "public"
124
124
  },
125
125
  "scripts": {
126
126
  "build": "tsup"
@@ -1,2 +0,0 @@
1
- import {e,a}from'./chunk-GTUQRT5Q.js';import {exchangeRate}from'@aave/client/actions';import {ChainsFilter,ChainQuery,ChainsQuery,ExchangeRateQuery}from'@aave/graphql';import {UnexpectedError}from'@aave/client';import {identity,invariant}from'@aave/types';import {useState,useMemo,useEffect}from'react';import {useQuery}from'urql';var u={Loading:()=>({data:void 0,error:void 0,loading:true,paused:false}),Success:e=>({data:e,error:void 0,loading:false,paused:false}),Failure:e=>({data:void 0,error:e,loading:false,paused:false}),Paused:(e,a)=>({data:e,error:a,loading:false,paused:true})};function p({document:e,variables:a,suspense:s,pause:t,selector:b=identity,pollInterval:i=0}){let[y,g]=useState(true),[{fetching:n,data:r,error:l},c]=useQuery({query:e,variables:a,pause:t,context:useMemo(()=>({suspense:s}),[s])});if(useEffect(()=>{t||n||g(false);},[n,t]),useEffect(()=>{if(i<=0||n||t)return;let o=setTimeout(()=>{c({requestPolicy:"network-only"});},i);return ()=>clearTimeout(o)},[n,c,i,t]),t)return u.Paused(r?b(r.value):void 0,l?UnexpectedError.from(l):void 0);if(!s&&y)return u.Loading();if(l){let o=UnexpectedError.from(l);if(s)throw o;return u.Failure(o)}return invariant(r,"No data returned"),u.Success(b(r.value))}function M({suspense:e=false,pause:a=false,...s}){return p({document:ChainQuery,variables:{request:s},suspense:e,pause:a})}function j({suspense:e=false,pause:a=false,filter:s}={filter:ChainsFilter.ALL}){return p({document:ChainsQuery,variables:{filter:s},suspense:e,pause:a})}function z(){let e$1=e();return a(a=>exchangeRate(e$1,a),[e$1])}function B({suspense:e$1=false,pause:a=false,...s}){let t=e();return p({document:ExchangeRateQuery,variables:{request:s},suspense:e$1,pause:a,pollInterval:s.at?0:t.context.environment.exchangeRateInterval})}export{u as a,p as b,M as c,j as d,z as e,B as f};//# sourceMappingURL=chunk-XIDOSID3.js.map
2
- //# sourceMappingURL=chunk-XIDOSID3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/helpers/results.ts","../src/helpers/reads.ts","../src/misc.ts"],"names":["ReadResult","data","error","useSuspendableQuery","document","variables","suspense","pause","selector","identity","pollInterval","loading","setLoading","useState","fetching","executeQuery","useQuery","useMemo","useEffect","timerId","UnexpectedError","unexpected","invariant","useChain","request","ChainQuery","useChains","filter","ChainsFilter","ChainsQuery","useExchangeRateAction","client","useAaveClient","useAsyncTask","exchangeRate","useExchangeRate","ExchangeRateQuery"],"mappings":"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","file":"chunk-XIDOSID3.js","sourcesContent":["import type { UnexpectedError } from '@aave/client';\n\n/**\n * A read hook result.\n *\n * It's a discriminated union of the possible results of a read operation:\n * - Rely on the `loading` value to determine if the `data` or `error` can be evaluated.\n * - If `error` is `undefined`, then `data` value will be available.\n */\nexport type ReadResult<T, E extends UnexpectedError = UnexpectedError> =\n | {\n data: undefined;\n error: undefined;\n loading: true;\n }\n | {\n data: T;\n error: undefined;\n loading: false;\n }\n | {\n data: undefined;\n error: E;\n loading: false;\n };\n\n/**\n * A read hook result that supports pausing.\n */\nexport type PausableReadResult<T, E extends UnexpectedError = UnexpectedError> =\n | {\n data: T | undefined;\n error: E | undefined;\n loading: false;\n paused: true;\n }\n | {\n data: undefined;\n error: undefined;\n loading: true;\n paused: false;\n }\n | {\n data: T;\n error: undefined;\n loading: false;\n paused: false;\n }\n | {\n data: undefined;\n error: E;\n loading: false;\n paused: false;\n };\n\n/**\n * @internal\n */\nexport const ReadResult = {\n Loading: <\n T,\n E extends UnexpectedError = UnexpectedError,\n >(): PausableReadResult<T, E> => ({\n data: undefined,\n error: undefined,\n loading: true,\n paused: false,\n }),\n Success: <T, E extends UnexpectedError = UnexpectedError>(\n data: T,\n ): PausableReadResult<T, E> => ({\n data,\n error: undefined,\n loading: false,\n paused: false,\n }),\n Failure: <T, E extends UnexpectedError = UnexpectedError>(\n error: E,\n ): PausableReadResult<T, E> => ({\n data: undefined,\n error,\n loading: false,\n paused: false,\n }),\n Paused: <T, E extends UnexpectedError = UnexpectedError>(\n data: T | undefined,\n error: E | undefined,\n ): PausableReadResult<T, E> => ({\n data,\n error,\n loading: false,\n paused: true,\n }),\n};\n\n/**\n * A read hook result that supports React Suspense.\n */\nexport type SuspenseResult<T> = {\n data: T;\n};\n\n/**\n * A read hook result that supports React Suspense and can be paused.\n */\nexport type PausableSuspenseResult<T> =\n | {\n paused: true;\n data: undefined;\n }\n | {\n paused: false;\n data: T;\n };\n\nexport type SuspendableResult<T, E extends UnexpectedError = UnexpectedError> =\n | ReadResult<T, E>\n | SuspenseResult<T>\n | PausableReadResult<T, E>\n | PausableSuspenseResult<T>;\n","import { type StandardData, UnexpectedError } from '@aave/client';\nimport {\n type AnyVariables,\n identity,\n invariant,\n type NullishDeep,\n type Prettify,\n} from '@aave/types';\nimport { useEffect, useMemo, useState } from 'react';\nimport { type TypedDocumentNode, useQuery } from 'urql';\nimport {\n type PausableReadResult,\n type PausableSuspenseResult,\n ReadResult,\n type SuspendableResult,\n type SuspenseResult,\n} from './results';\n\nexport type Selector<T, V> = (data: T) => V;\n\nexport type Pausable<T, WhenPaused = NullishDeep<T>> = Prettify<\n WhenPaused & {\n /**\n * Prevents the hook from automatically executing GraphQL query operations.\n *\n * @experimental This is an experimental feature and may change in the future.\n *\n * @remarks\n * `pause` may be set to `true` to stop the query operation from executing\n * automatically. The hook will stop receiving updates and won’t execute the query\n * operation until it’s set to `false`.\n */\n pause: boolean;\n }\n>;\n\nexport type Suspendable = { suspense: true };\n\n/**\n * @internal\n */\nexport type UseSuspendableQueryArgs<\n Value,\n Output,\n Variables extends AnyVariables,\n Suspense extends boolean,\n Pause extends boolean = never,\n> = {\n document: TypedDocumentNode<StandardData<Value>, Variables>;\n variables?: Pause extends boolean ? NullishDeep<Variables> : Variables;\n suspense: Suspense;\n selector?: Selector<Value, Output>;\n pollInterval?: number;\n pause?: Pause;\n};\n\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<Value, Output, Variables, false, Pausable>):\n | ReadResult<Output>\n | PausableReadResult<Output>;\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<Value, Output, Variables, true, Pausable>):\n | SuspenseResult<Output>\n | PausableSuspenseResult<Output>;\n/**\n * @internal\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n Pausable extends boolean = never,\n>({\n document,\n variables,\n suspense,\n pause,\n}: UseSuspendableQueryArgs<\n Value,\n Output,\n Variables,\n boolean,\n Pausable\n>): SuspendableResult<Output, UnexpectedError>;\n/**\n * Implementation.\n */\nexport function useSuspendableQuery<\n Value,\n Output,\n Variables extends AnyVariables,\n>({\n document,\n variables,\n suspense,\n pause,\n selector = identity as Selector<Value, Output>,\n pollInterval = 0,\n}: UseSuspendableQueryArgs<\n Value,\n Output,\n Variables,\n boolean,\n boolean\n>): SuspendableResult<Output, UnexpectedError> {\n const [loading, setLoading] = useState(true);\n const [{ fetching, data, error }, executeQuery] = useQuery({\n query: document,\n variables: variables as Variables,\n pause,\n context: useMemo(\n () => ({\n suspense,\n }),\n [suspense],\n ),\n });\n\n useEffect(() => {\n if (pause) return;\n\n if (!fetching) {\n setLoading(false);\n }\n }, [fetching, pause]);\n\n useEffect(() => {\n if (pollInterval <= 0 || fetching || pause) return undefined;\n\n const timerId = setTimeout(() => {\n executeQuery({\n requestPolicy: 'network-only',\n });\n }, pollInterval);\n\n return () => clearTimeout(timerId);\n }, [fetching, executeQuery, pollInterval, pause]);\n\n if (pause) {\n return ReadResult.Paused(\n data ? selector(data.value) : undefined,\n error ? UnexpectedError.from(error) : undefined,\n );\n }\n\n if (!suspense && loading) {\n return ReadResult.Loading();\n }\n\n if (error) {\n const unexpected = UnexpectedError.from(error);\n if (suspense) {\n throw unexpected;\n }\n\n return ReadResult.Failure(unexpected);\n }\n\n invariant(data, 'No data returned');\n\n return ReadResult.Success(selector(data.value));\n}\n","import type { CurrencyQueryOptions } from '@aave/client';\nimport { exchangeRate } from '@aave/client/actions';\nimport type { UnexpectedError } from '@aave/core';\nimport type { Chain, ExchangeRateRequest, FiatAmount } from '@aave/graphql';\nimport {\n type ActivityItem,\n ChainQuery,\n type ChainRequest,\n ChainsFilter,\n ChainsQuery,\n ExchangeRateQuery,\n type NativeAmount,\n type PreviewAction,\n} from '@aave/graphql';\nimport type { NullishDeep, Prettify } from '@aave/types';\nimport { useAaveClient } from './context';\nimport {\n type Pausable,\n type PausableReadResult,\n type PausableSuspenseResult,\n type ReadResult,\n type Suspendable,\n type SuspendableResult,\n type SuspenseResult,\n useSuspendableQuery,\n} from './helpers';\nimport { type UseAsyncTask, useAsyncTask } from './helpers/tasks';\n\nexport type UseChainArgs = ChainRequest;\n\n/**\n * Fetch a specific chain by chain ID.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useChain({\n * chainId: chainId(1),\n * suspense: true,\n * });\n * // data will be Chain | null\n * ```\n */\nexport function useChain(\n args: UseChainArgs & Suspendable,\n): SuspenseResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useChain({\n * chainId: chainId(1),\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useChain(\n args: Pausable<UseChainArgs> & Suspendable,\n): PausableSuspenseResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * ```tsx\n * const { data, error, loading } = useChain({\n * chainId: chainId(1),\n * });\n * // data will be Chain | null\n * ```\n */\nexport function useChain(args: UseChainArgs): ReadResult<Chain | null>;\n/**\n * Fetch a specific chain by chain ID.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useChain({\n * chainId: chainId(1),\n * pause: true,\n * });\n * ```\n */\nexport function useChain(\n args: Pausable<UseChainArgs>,\n): PausableReadResult<Chain | null>;\n\nexport function useChain({\n suspense = false,\n pause = false,\n ...request\n}: NullishDeep<UseChainArgs> & {\n suspense?: boolean;\n pause?: boolean;\n}): SuspendableResult<Chain | null, UnexpectedError> {\n return useSuspendableQuery({\n document: ChainQuery,\n variables: {\n request,\n },\n suspense,\n pause,\n });\n}\n\nexport type UseChainsArgs = {\n filter: ChainsFilter;\n};\n/**\n * Fetches the list of supported chains.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useChains({\n * filter: ChainsFilter.ALL,\n * suspense: true,\n * });\n * ```\n */\nexport function useChains(\n args: UseChainsArgs & Suspendable,\n): SuspenseResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useChains({\n * filter: ChainsFilter.ALL,\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useChains(\n args: Pausable<UseChainsArgs> & Suspendable,\n): PausableSuspenseResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * ```tsx\n * const { data, error, loading } = useChains({\n * filter: ChainsFilter.ALL,\n * });\n * ```\n */\nexport function useChains(args?: UseChainsArgs): ReadResult<Chain[]>;\n/**\n * Fetches the list of supported chains.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useChains({\n * filter: ChainsFilter.ALL,\n * pause: true,\n * });\n * ```\n */\nexport function useChains(\n args?: Pausable<UseChainsArgs>,\n): PausableReadResult<Chain[]>;\n\nexport function useChains(\n {\n suspense = false,\n pause = false,\n filter,\n }: NullishDeep<UseChainsArgs> & {\n suspense?: boolean;\n pause?: boolean;\n } = { filter: ChainsFilter.ALL },\n): SuspendableResult<Chain[], UnexpectedError> {\n return useSuspendableQuery({\n document: ChainsQuery,\n variables: { filter },\n suspense,\n pause,\n });\n}\n\n/**\n * Fetches exchange rates between tokens and fiat currencies.\n *\n * ```tsx\n * const [getExchangeRate, gettingRate] = useExchangeRateAction();\n *\n * const loading = gettingRate.loading;\n * const error = gettingRate.error;\n *\n * // …\n *\n * const result = await getExchangeRate({\n * from: { erc20: { chainId: chainId(1), address: evmAddress('0xA0b86a33E6...') } },\n * to: Currency.Usd,\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Exchange rate:', result.value);\n * ```\n */\nexport function useExchangeRateAction(): UseAsyncTask<\n ExchangeRateRequest,\n FiatAmount,\n UnexpectedError\n> {\n const client = useAaveClient();\n\n return useAsyncTask(\n (request: ExchangeRateRequest) => exchangeRate(client, request),\n [client],\n );\n}\n\nexport type UseExchangeRateArgs = ExchangeRateRequest;\n\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * suspense: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: UseExchangeRateArgs & Suspendable,\n): SuspenseResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * suspense: true,\n * pause: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: Pausable<UseExchangeRateArgs> & Suspendable,\n): PausableSuspenseResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * ```tsx\n * const { data, error, loading } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * });\n *\n * <Component value={somewhere} fxRate={data} />\n * ```\n */\nexport function useExchangeRate(\n args: UseExchangeRateArgs,\n): ReadResult<FiatAmount>;\n/**\n * Fetches exchange rates between tokens and fiat currencies with automatic polling.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useExchangeRate({\n * from: {\n * erc20: {\n * chainId: chainId(1),\n * address: evmAddress('0xA0b86a33E6...')\n * }\n * },\n * to: Currency.Usd,\n * pause: true,\n * });\n * ```\n */\nexport function useExchangeRate(\n args: Pausable<UseExchangeRateArgs>,\n): PausableReadResult<FiatAmount>;\n\nexport function useExchangeRate({\n suspense = false,\n pause = false,\n ...request\n}: NullishDeep<UseExchangeRateArgs> & {\n suspense?: boolean;\n pause?: boolean;\n}): SuspendableResult<FiatAmount, UnexpectedError> {\n const client = useAaveClient();\n\n return useSuspendableQuery({\n document: ExchangeRateQuery,\n variables: { request },\n suspense,\n pause,\n pollInterval: request.at\n ? 0\n : client.context.environment.exchangeRateInterval,\n });\n}\n\nexport type UseNetworkFeeRequestQuery =\n | {\n activity: ActivityItem;\n }\n | {\n estimate: PreviewAction;\n };\n\nexport type UseNetworkFeeArgs = Prettify<\n {\n query: UseNetworkFeeRequestQuery;\n } & CurrencyQueryOptions\n>;\n\ntype PausableUseNetworkFeeArgs = Partial<\n {\n query: Partial<UseNetworkFeeRequestQuery>;\n } & CurrencyQueryOptions\n>;\n\n/**\n * Fetch the network fee for an ActivityItem.\n *\n * @experimental This hook is experimental and may be subject to breaking changes.\n */\nexport type UseNetworkFee<T extends NativeAmount = NativeAmount> =\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * This signature supports React Suspense:\n *\n * ```tsx\n * const { data } = useNetworkFee({\n * query: { activity },\n * suspense: true,\n * });\n *\n * data: NativeAmount\n * ```\n */\n ((args: UseNetworkFeeArgs & Suspendable) => SuspenseResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * Pausable suspense mode.\n *\n * ```tsx\n * const { data, paused } = useNetworkFee({\n * query: { activity },\n * suspense: true,\n * pause: true,\n * });\n *\n * data: NativeAmount | undefined\n * ```\n */\n ((\n args: Pausable<UseNetworkFeeArgs, PausableUseNetworkFeeArgs> &\n Suspendable,\n ) => PausableSuspenseResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * ```tsx\n * const { data, error, loading } = useNetworkFee({\n * query: { activity },\n * });\n * ```\n */\n ((args: UseNetworkFeeArgs) => ReadResult<T>) &\n /**\n * Fetches the network fee for a past ActivityItem.\n *\n * Pausable loading state mode.\n *\n * ```tsx\n * const { data, error, loading, paused } = useNetworkFee({\n * query: { activity },\n * pause: true,\n * });\n *\n * data: NativeAmount | undefined\n * ```\n */\n ((\n args: Pausable<UseNetworkFeeArgs, PausableUseNetworkFeeArgs>,\n ) => PausableReadResult<T>);\n"]}