@aave/react 0.6.0 → 0.7.0

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.
@@ -0,0 +1,87 @@
1
+ import { ResultAsync } from '@aave/types';
2
+
3
+ /**
4
+ * An async task is a function that can be executed multiple times and that can be in a pending state.
5
+ *
6
+ * @internal
7
+ */
8
+ type AsyncTask<TInput, TResult extends ResultAsync<unknown, unknown>> = (input: TInput) => TResult;
9
+ /**
10
+ * The initial state of a async task.
11
+ */
12
+ type AsyncTaskIdle = {
13
+ called: boolean;
14
+ loading: false;
15
+ data: undefined;
16
+ error: undefined;
17
+ };
18
+ /**
19
+ * The state of a async task during the loading.
20
+ */
21
+ type AsyncTaskLoading<TData> = {
22
+ called: true;
23
+ loading: true;
24
+ data: TData | undefined;
25
+ error: undefined;
26
+ };
27
+ /**
28
+ * The state of a async task after a successful call.
29
+ */
30
+ type AsyncTaskSuccess<TData> = {
31
+ called: true;
32
+ loading: false;
33
+ data: TData;
34
+ error: undefined;
35
+ };
36
+ /**
37
+ * The state of a async task after a failed call.
38
+ */
39
+ type AsyncTaskError<TError> = {
40
+ called: true;
41
+ loading: false;
42
+ data: undefined;
43
+ error: TError;
44
+ };
45
+ /**
46
+ * The possible statuses of a async task.
47
+ */
48
+ type AsyncTaskState<TData, TError> = AsyncTaskIdle | AsyncTaskLoading<TData> | AsyncTaskSuccess<TData> | AsyncTaskError<TError>;
49
+ /**
50
+ * A async task React Hook is a lightweight wrapper for an asynchronous function.
51
+ * It allows tracking of the task's execution status and provides access to the
52
+ * last error that occurred during the task's execution, if any.
53
+ *
54
+ * ```ts
55
+ * const [execute, { called, loading, data, error }]: UseAsyncTask<TData, TError, TInput> = useAnyAsyncTask();
56
+ *
57
+ * if (!called) {
58
+ * // data === undefined
59
+ * // error === undefined
60
+ * return <p>Click the button to execute the task</p>;
61
+ * }
62
+ *
63
+ * if (loading) {
64
+ * // data === undefined on first call
65
+ * // data === TData from previous successful call
66
+ * // error === undefined
67
+ * return <Loader />;
68
+ * }
69
+ *
70
+ * if (error) {
71
+ * // data === undefined
72
+ * // error === TError
73
+ * return <p>Something went wrong: {error.message}</p>;
74
+ * }
75
+ *
76
+ * // called === true
77
+ * // data === TData
78
+ * // error === undefined
79
+ * return <p>Task completed: {data}</p>;
80
+ * ```
81
+ */
82
+ type UseAsyncTask<TInput, TValue, TError> = [
83
+ AsyncTask<TInput, ResultAsync<TValue, TError>>,
84
+ AsyncTaskState<TValue, TError>
85
+ ];
86
+
87
+ export type { UseAsyncTask as U };
@@ -0,0 +1,3 @@
1
+ 'use strict';var client=require('@aave/client'),actions=require('@aave/client/actions'),types=require('@aave/types'),thirdweb=require('thirdweb'),react=require('thirdweb/react'),y=require('react');require('urql');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var y__default=/*#__PURE__*/_interopDefault(y);var A=y__default.default.createContext(null);function i(){let e=y.useContext(A);return types.invariant(e,"Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>"),e}var d={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 c(e){let[a,o]=y.useState(d.Idle());return [y.useCallback(r=>{types.invariant(!a.loading,"Cannot execute a task while another is in progress."),o(({data:s})=>({called:true,loading:true,data:s,error:void 0}));let t=e(r);return t.match(s=>o(d.Success(s)),s=>o(d.Failed(s))),t},[e,a]),a]}function G(e){let a=i(),o=react.useSwitchActiveWalletChain(),{mutateAsync:n}=react.useSendAndConfirmTransaction();return c(r=>types.ResultAsync.fromPromise(o(thirdweb.defineChain({id:r.chainId})),t=>client.UnexpectedError.from(t)).andThen(()=>types.ResultAsync.fromPromise(n({to:r.to,data:r.data,value:BigInt(r.value),chain:{id:r.chainId,rpc:`https://${r.chainId}.rpc.thirdweb.com/${e.clientId}`},client:e}),t=>client.SigningError.from(t))).andThen(t=>t.status==="reverted"?client.TransactionError.new({txHash:types.txHash(t.transactionHash),request:r}).asResultAsync():types.okAsync(types.txHash(t.transactionHash))).map(t=>({operation:r.operation,txHash:t})).andThen(a.waitForSupportedTransaction))}function J(){let e=i(),a=react.useActiveAccount();return c(o=>(types.invariant(a,"No Account found. Ensure you have connected your wallet."),actions.permitTypedData(e,o).andThen(n=>types.ResultAsync.fromPromise(a.signTypedData({types:n.types,domain:n.domain,primaryType:n.primaryType,message:n.message}),r=>client.SigningError.from(r)).map(r=>({deadline:n.message.deadline,value:types.signatureFrom(r)})))))}
2
+ exports.useERC20Permit=J;exports.useSendTransaction=G;//# sourceMappingURL=thirdweb.cjs.map
3
+ //# sourceMappingURL=thirdweb.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.tsx","../src/helpers/tasks.ts","../src/thirdweb.ts"],"names":["AaveContext","React","useAaveClient","client","useContext","invariant","AsyncTaskState","data","error","useAsyncTask","handler","state","setState","useState","useCallback","input","result","value","useSendTransaction","thirdwebClient","switchChain","useSwitchActiveWalletChain","sendAndConfirmTx","useSendAndConfirmTransaction","request","ResultAsync","defineChain","err","UnexpectedError","SigningError","receipt","TransactionError","txHash","okAsync","hash","useERC20Permit","account","useActiveAccount","permitTypedData","signature","signatureFrom"],"mappings":"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","file":"thirdweb.cjs","sourcesContent":["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 * Retrieve the injected {@link AaveClient} from the context.\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 { invariant, type ResultAsync } from '@aave/types';\nimport { useCallback, 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>(handler: AsyncTask<TInput, TResult>): UseAsyncTask<TInput, TValue, TError> {\n const [state, setState] = useState(AsyncTaskState.Idle<TValue, TError>());\n\n const execute = useCallback(\n (input: TInput) => {\n invariant(\n !state.loading,\n 'Cannot execute a task while another is in progress.',\n );\n\n setState(({ data }) => {\n return {\n called: true,\n loading: true,\n data,\n error: undefined,\n };\n });\n\n const result = handler(input);\n\n result.match(\n (value) => setState(AsyncTaskState.Success(value)),\n (error) => setState(AsyncTaskState.Failed(error)),\n );\n\n return result;\n },\n [handler, state],\n );\n\n return [execute, state];\n}\n","import {\n SigningError,\n type TimeoutError,\n TransactionError,\n UnexpectedError,\n} from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport type {\n ERC712Signature,\n PermitTypedDataRequest,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n invariant,\n okAsync,\n ResultAsync,\n signatureFrom,\n type TxHash,\n txHash,\n} from '@aave/types';\nimport { defineChain, type ThirdwebClient } from 'thirdweb';\nimport {\n useActiveAccount,\n useSendAndConfirmTransaction,\n useSwitchActiveWalletChain,\n} from 'thirdweb/react';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers/tasks';\n\nexport type SendTransactionError =\n | SigningError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\n/**\n * A hook that provides a way to send Aave transactions using a Thirdweb wallet.\n *\n * First, use the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.\n *\n * ```ts\n * import { createThirdwebClient } from 'thirdweb';\n *\n * const thirdwebClient = createThirdwebClient({\n * clientId: \"<THIRDWEB_CLIENT_ID>\",\n * });\n *\n * const [sendTransaction, { loading, error, data }] = useSendTransaction(thirdwebClient);\n * ```\n *\n * Then, use it to send a {@link TransactionRequest} as shown below.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n *\n * const [toggle, { loading, error, data }] = useEModeToggle();\n *\n * const run = async () => {\n * const result = await toggle({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * user: evmAddress(account!.address),\n * })\n * .andThen(sendTransaction);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Transaction sent with hash:', result.value);\n * };\n * ```\n *\n * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n *\n * const [supply, { loading, error, data }] = useSupply();\n *\n * const run = async () => {\n * const result = await supply({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * amount: {\n * erc20: {\n * currency: evmAddress('0x5678…'),\n * value: '42.42',\n * }\n * },\n * supplier: evmAddress(account!.address),\n * })\n * .andThen((plan) => {\n * switch (plan.__typename) {\n * case 'TransactionRequest':\n * return sendTransaction(plan);\n *\n * case 'ApprovalRequired':\n * return sendTransaction(plan.approval).andThen(() =>\n * sendTransaction(plan.originalTransaction),\n * );\n *\n * case 'InsufficientBalanceError':\n * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));\n * }\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Transaction sent with hash:', result.value);\n * }\n * ```\n */\nexport function useSendTransaction(\n thirdwebClient: ThirdwebClient,\n): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError> {\n const client = useAaveClient();\n const switchChain = useSwitchActiveWalletChain();\n const { mutateAsync: sendAndConfirmTx } = useSendAndConfirmTransaction();\n\n return useAsyncTask((request: TransactionRequest) => {\n return ResultAsync.fromPromise(\n switchChain(defineChain({ id: request.chainId })),\n (err) => UnexpectedError.from(err),\n )\n .andThen(() =>\n ResultAsync.fromPromise(\n sendAndConfirmTx({\n to: request.to,\n data: request.data,\n value: BigInt(request.value),\n chain: {\n id: request.chainId,\n rpc: `https://${request.chainId}.rpc.thirdweb.com/${thirdwebClient.clientId}`,\n },\n client: thirdwebClient,\n }),\n (err) => SigningError.from(err),\n ),\n )\n .andThen((receipt) =>\n receipt.status === 'reverted'\n ? TransactionError.new({\n txHash: txHash(receipt.transactionHash),\n request,\n }).asResultAsync()\n : okAsync(txHash(receipt.transactionHash)),\n )\n .map((hash) => ({\n operation: request.operation,\n txHash: hash,\n }))\n .andThen(client.waitForSupportedTransaction);\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 [signERC20Permit, { loading, error, data }] = useERC20Permit();\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * underlyingToken: evmAddress('0x5678…'),\n * amount: '42.42',\n * spender: evmAddress('0x9abc…'),\n * owner: evmAddress(account.address!),\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 permit signed:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(): UseAsyncTask<\n PermitTypedDataRequest,\n ERC712Signature,\n SignERC20PermitError\n> {\n const client = useAaveClient();\n const account = useActiveAccount();\n\n return useAsyncTask((request: PermitTypedDataRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n return permitTypedData(client, 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}\n"]}
@@ -0,0 +1,119 @@
1
+ import { SigningError, TimeoutError, TransactionError, UnexpectedError } from '@aave/client';
2
+ import { TransactionRequest, PermitTypedDataRequest, ERC712Signature } from '@aave/graphql';
3
+ import { TxHash } from '@aave/types';
4
+ import { ThirdwebClient } from 'thirdweb';
5
+ import { U as UseAsyncTask } from './tasks-DUn7x8pK.cjs';
6
+
7
+ type SendTransactionError = SigningError | TimeoutError | TransactionError | UnexpectedError;
8
+ /**
9
+ * A hook that provides a way to send Aave transactions using a Thirdweb wallet.
10
+ *
11
+ * First, use the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.
12
+ *
13
+ * ```ts
14
+ * import { createThirdwebClient } from 'thirdweb';
15
+ *
16
+ * const thirdwebClient = createThirdwebClient({
17
+ * clientId: "<THIRDWEB_CLIENT_ID>",
18
+ * });
19
+ *
20
+ * const [sendTransaction, { loading, error, data }] = useSendTransaction(thirdwebClient);
21
+ * ```
22
+ *
23
+ * Then, use it to send a {@link TransactionRequest} as shown below.
24
+ *
25
+ * ```ts
26
+ * const account = useActiveAccount(); // thirdweb hook
27
+ *
28
+ * const [toggle, { loading, error, data }] = useEModeToggle();
29
+ *
30
+ * const run = async () => {
31
+ * const result = await toggle({
32
+ * chainId: chainId(1), // Ethereum mainnet
33
+ * market: evmAddress('0x1234…'),
34
+ * user: evmAddress(account!.address),
35
+ * })
36
+ * .andThen(sendTransaction);
37
+ *
38
+ * if (result.isErr()) {
39
+ * console.error(result.error);
40
+ * return;
41
+ * }
42
+ *
43
+ * console.log('Transaction sent with hash:', result.value);
44
+ * };
45
+ * ```
46
+ *
47
+ * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.
48
+ *
49
+ * ```ts
50
+ * const account = useActiveAccount(); // thirdweb hook
51
+ *
52
+ * const [supply, { loading, error, data }] = useSupply();
53
+ *
54
+ * const run = async () => {
55
+ * const result = await supply({
56
+ * chainId: chainId(1), // Ethereum mainnet
57
+ * market: evmAddress('0x1234…'),
58
+ * amount: {
59
+ * erc20: {
60
+ * currency: evmAddress('0x5678…'),
61
+ * value: '42.42',
62
+ * }
63
+ * },
64
+ * supplier: evmAddress(account!.address),
65
+ * })
66
+ * .andThen((plan) => {
67
+ * switch (plan.__typename) {
68
+ * case 'TransactionRequest':
69
+ * return sendTransaction(plan);
70
+ *
71
+ * case 'ApprovalRequired':
72
+ * return sendTransaction(plan.approval).andThen(() =>
73
+ * sendTransaction(plan.originalTransaction),
74
+ * );
75
+ *
76
+ * case 'InsufficientBalanceError':
77
+ * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));
78
+ * }
79
+ * });
80
+ *
81
+ * if (result.isErr()) {
82
+ * console.error(result.error);
83
+ * return;
84
+ * }
85
+ *
86
+ * console.log('Transaction sent with hash:', result.value);
87
+ * }
88
+ * ```
89
+ */
90
+ declare function useSendTransaction(thirdwebClient: ThirdwebClient): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError>;
91
+ type SignERC20PermitError = SigningError | UnexpectedError;
92
+ /**
93
+ * A hook that provides a way to sign ERC20 permits using a Thirdweb wallet.
94
+ *
95
+ * ```ts
96
+ * const [signERC20Permit, { loading, error, data }] = useERC20Permit();
97
+ *
98
+ * const run = async () => {
99
+ * const result = await signERC20Permit({
100
+ * chainId: chainId(1), // Ethereum mainnet
101
+ * market: evmAddress('0x1234…'),
102
+ * underlyingToken: evmAddress('0x5678…'),
103
+ * amount: '42.42',
104
+ * spender: evmAddress('0x9abc…'),
105
+ * owner: evmAddress(account.address!),
106
+ * });
107
+ *
108
+ * if (result.isErr()) {
109
+ * console.error(result.error);
110
+ * return;
111
+ * }
112
+ *
113
+ * console.log('ERC20 permit signed:', result.value);
114
+ * };
115
+ * ```
116
+ */
117
+ declare function useERC20Permit(): UseAsyncTask<PermitTypedDataRequest, ERC712Signature, SignERC20PermitError>;
118
+
119
+ export { type SendTransactionError, type SignERC20PermitError, useERC20Permit, useSendTransaction };
@@ -0,0 +1,119 @@
1
+ import { SigningError, TimeoutError, TransactionError, UnexpectedError } from '@aave/client';
2
+ import { TransactionRequest, PermitTypedDataRequest, ERC712Signature } from '@aave/graphql';
3
+ import { TxHash } from '@aave/types';
4
+ import { ThirdwebClient } from 'thirdweb';
5
+ import { U as UseAsyncTask } from './tasks-DUn7x8pK.js';
6
+
7
+ type SendTransactionError = SigningError | TimeoutError | TransactionError | UnexpectedError;
8
+ /**
9
+ * A hook that provides a way to send Aave transactions using a Thirdweb wallet.
10
+ *
11
+ * First, use the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.
12
+ *
13
+ * ```ts
14
+ * import { createThirdwebClient } from 'thirdweb';
15
+ *
16
+ * const thirdwebClient = createThirdwebClient({
17
+ * clientId: "<THIRDWEB_CLIENT_ID>",
18
+ * });
19
+ *
20
+ * const [sendTransaction, { loading, error, data }] = useSendTransaction(thirdwebClient);
21
+ * ```
22
+ *
23
+ * Then, use it to send a {@link TransactionRequest} as shown below.
24
+ *
25
+ * ```ts
26
+ * const account = useActiveAccount(); // thirdweb hook
27
+ *
28
+ * const [toggle, { loading, error, data }] = useEModeToggle();
29
+ *
30
+ * const run = async () => {
31
+ * const result = await toggle({
32
+ * chainId: chainId(1), // Ethereum mainnet
33
+ * market: evmAddress('0x1234…'),
34
+ * user: evmAddress(account!.address),
35
+ * })
36
+ * .andThen(sendTransaction);
37
+ *
38
+ * if (result.isErr()) {
39
+ * console.error(result.error);
40
+ * return;
41
+ * }
42
+ *
43
+ * console.log('Transaction sent with hash:', result.value);
44
+ * };
45
+ * ```
46
+ *
47
+ * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.
48
+ *
49
+ * ```ts
50
+ * const account = useActiveAccount(); // thirdweb hook
51
+ *
52
+ * const [supply, { loading, error, data }] = useSupply();
53
+ *
54
+ * const run = async () => {
55
+ * const result = await supply({
56
+ * chainId: chainId(1), // Ethereum mainnet
57
+ * market: evmAddress('0x1234…'),
58
+ * amount: {
59
+ * erc20: {
60
+ * currency: evmAddress('0x5678…'),
61
+ * value: '42.42',
62
+ * }
63
+ * },
64
+ * supplier: evmAddress(account!.address),
65
+ * })
66
+ * .andThen((plan) => {
67
+ * switch (plan.__typename) {
68
+ * case 'TransactionRequest':
69
+ * return sendTransaction(plan);
70
+ *
71
+ * case 'ApprovalRequired':
72
+ * return sendTransaction(plan.approval).andThen(() =>
73
+ * sendTransaction(plan.originalTransaction),
74
+ * );
75
+ *
76
+ * case 'InsufficientBalanceError':
77
+ * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));
78
+ * }
79
+ * });
80
+ *
81
+ * if (result.isErr()) {
82
+ * console.error(result.error);
83
+ * return;
84
+ * }
85
+ *
86
+ * console.log('Transaction sent with hash:', result.value);
87
+ * }
88
+ * ```
89
+ */
90
+ declare function useSendTransaction(thirdwebClient: ThirdwebClient): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError>;
91
+ type SignERC20PermitError = SigningError | UnexpectedError;
92
+ /**
93
+ * A hook that provides a way to sign ERC20 permits using a Thirdweb wallet.
94
+ *
95
+ * ```ts
96
+ * const [signERC20Permit, { loading, error, data }] = useERC20Permit();
97
+ *
98
+ * const run = async () => {
99
+ * const result = await signERC20Permit({
100
+ * chainId: chainId(1), // Ethereum mainnet
101
+ * market: evmAddress('0x1234…'),
102
+ * underlyingToken: evmAddress('0x5678…'),
103
+ * amount: '42.42',
104
+ * spender: evmAddress('0x9abc…'),
105
+ * owner: evmAddress(account.address!),
106
+ * });
107
+ *
108
+ * if (result.isErr()) {
109
+ * console.error(result.error);
110
+ * return;
111
+ * }
112
+ *
113
+ * console.log('ERC20 permit signed:', result.value);
114
+ * };
115
+ * ```
116
+ */
117
+ declare function useERC20Permit(): UseAsyncTask<PermitTypedDataRequest, ERC712Signature, SignERC20PermitError>;
118
+
119
+ export { type SendTransactionError, type SignERC20PermitError, useERC20Permit, useSendTransaction };
@@ -0,0 +1,3 @@
1
+ import {b,c}from'./chunk-SECI6TSB.js';import {UnexpectedError,SigningError,TransactionError}from'@aave/client';import {permitTypedData}from'@aave/client/actions';import {ResultAsync,okAsync,txHash,invariant,signatureFrom}from'@aave/types';import {defineChain}from'thirdweb';import {useSwitchActiveWalletChain,useSendAndConfirmTransaction,useActiveAccount}from'thirdweb/react';function H(t){let a=b(),o=useSwitchActiveWalletChain(),{mutateAsync:e}=useSendAndConfirmTransaction();return c(n=>ResultAsync.fromPromise(o(defineChain({id:n.chainId})),r=>UnexpectedError.from(r)).andThen(()=>ResultAsync.fromPromise(e({to:n.to,data:n.data,value:BigInt(n.value),chain:{id:n.chainId,rpc:`https://${n.chainId}.rpc.thirdweb.com/${t.clientId}`},client:t}),r=>SigningError.from(r))).andThen(r=>r.status==="reverted"?TransactionError.new({txHash:txHash(r.transactionHash),request:n}).asResultAsync():okAsync(txHash(r.transactionHash))).map(r=>({operation:n.operation,txHash:r})).andThen(a.waitForSupportedTransaction))}function k(){let t=b(),a=useActiveAccount();return c(o=>(invariant(a,"No Account found. Ensure you have connected your wallet."),permitTypedData(t,o).andThen(e=>ResultAsync.fromPromise(a.signTypedData({types:e.types,domain:e.domain,primaryType:e.primaryType,message:e.message}),n=>SigningError.from(n)).map(n=>({deadline:e.message.deadline,value:signatureFrom(n)})))))}
2
+ export{k as useERC20Permit,H as useSendTransaction};//# sourceMappingURL=thirdweb.js.map
3
+ //# sourceMappingURL=thirdweb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/thirdweb.ts"],"names":["useSendTransaction","thirdwebClient","client","useAaveClient","switchChain","useSwitchActiveWalletChain","sendAndConfirmTx","useSendAndConfirmTransaction","useAsyncTask","request","ResultAsync","defineChain","err","UnexpectedError","SigningError","receipt","TransactionError","txHash","okAsync","hash","useERC20Permit","account","useActiveAccount","invariant","permitTypedData","result","signature","signatureFrom"],"mappings":"wXAqHO,SAASA,CAAAA,CACdC,CAAAA,CACgE,CAChE,IAAMC,CAAAA,CAASC,CAAAA,EAAc,CACvBC,CAAAA,CAAcC,0BAAAA,EAA2B,CACzC,CAAE,WAAA,CAAaC,CAAiB,CAAA,CAAIC,4BAAAA,EAA6B,CAEvE,OAAOC,EAAcC,CAAAA,EACZC,WAAAA,CAAY,WAAA,CACjBN,CAAAA,CAAYO,WAAAA,CAAY,CAAE,GAAIF,CAAAA,CAAQ,OAAQ,CAAC,CAAC,CAAA,CAC/CG,CAAAA,EAAQC,gBAAgB,IAAA,CAAKD,CAAG,CACnC,CAAA,CACG,OAAA,CAAQ,IACPF,YAAY,WAAA,CACVJ,CAAAA,CAAiB,CACf,EAAA,CAAIG,CAAAA,CAAQ,EAAA,CACZ,KAAMA,CAAAA,CAAQ,IAAA,CACd,KAAA,CAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAK,EAC3B,KAAA,CAAO,CACL,EAAA,CAAIA,CAAAA,CAAQ,OAAA,CACZ,GAAA,CAAK,WAAWA,CAAAA,CAAQ,OAAO,CAAA,kBAAA,EAAqBR,CAAAA,CAAe,QAAQ,CAAA,CAC7E,EACA,MAAA,CAAQA,CACV,CAAC,CAAA,CACAW,CAAAA,EAAQE,YAAAA,CAAa,KAAKF,CAAG,CAChC,CACF,CAAA,CACC,OAAA,CAASG,GACRA,CAAAA,CAAQ,MAAA,GAAW,UAAA,CACfC,gBAAAA,CAAiB,GAAA,CAAI,CACnB,OAAQC,MAAAA,CAAOF,CAAAA,CAAQ,eAAe,CAAA,CACtC,OAAA,CAAAN,CACF,CAAC,CAAA,CAAE,aAAA,EAAc,CACjBS,OAAAA,CAAQD,MAAAA,CAAOF,CAAAA,CAAQ,eAAe,CAAC,CAC7C,CAAA,CACC,GAAA,CAAKI,CAAAA,GAAU,CACd,UAAWV,CAAAA,CAAQ,SAAA,CACnB,MAAA,CAAQU,CACV,CAAA,CAAE,CAAA,CACD,QAAQjB,CAAAA,CAAO,2BAA2B,CAC9C,CACH,CA6BO,SAASkB,GAId,CACA,IAAMlB,CAAAA,CAASC,CAAAA,EAAc,CACvBkB,CAAAA,CAAUC,kBAAiB,CAEjC,OAAOd,CAAAA,CAAcC,CAAAA,GACnBc,SAAAA,CACEF,CAAAA,CACA,0DACF,CAAA,CAEOG,eAAAA,CAAgBtB,CAAAA,CAAQO,CAAO,CAAA,CAAE,OAAA,CAASgB,GAC/Cf,WAAAA,CAAY,WAAA,CACVW,CAAAA,CAAQ,aAAA,CAAc,CAEpB,KAAA,CAAOI,EAAO,KAAA,CACd,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,WAAA,CAAaA,CAAAA,CAAO,YACpB,OAAA,CAASA,CAAAA,CAAO,OAClB,CAAC,CAAA,CACAb,CAAAA,EAAQE,aAAa,IAAA,CAAKF,CAAG,CAChC,CAAA,CAAE,GAAA,CAAKc,CAAAA,GACE,CACL,QAAA,CAAUD,CAAAA,CAAO,OAAA,CAAQ,QAAA,CACzB,KAAA,CAAOE,aAAAA,CAAcD,CAAS,CAChC,CAAA,CACD,CACH,CAAA,CACD,CACH","file":"thirdweb.js","sourcesContent":["import {\n SigningError,\n type TimeoutError,\n TransactionError,\n UnexpectedError,\n} from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport type {\n ERC712Signature,\n PermitTypedDataRequest,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n invariant,\n okAsync,\n ResultAsync,\n signatureFrom,\n type TxHash,\n txHash,\n} from '@aave/types';\nimport { defineChain, type ThirdwebClient } from 'thirdweb';\nimport {\n useActiveAccount,\n useSendAndConfirmTransaction,\n useSwitchActiveWalletChain,\n} from 'thirdweb/react';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers/tasks';\n\nexport type SendTransactionError =\n | SigningError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\n/**\n * A hook that provides a way to send Aave transactions using a Thirdweb wallet.\n *\n * First, use the `useSendTransaction` hook from `@aave/react/thirdweb` entry point.\n *\n * ```ts\n * import { createThirdwebClient } from 'thirdweb';\n *\n * const thirdwebClient = createThirdwebClient({\n * clientId: \"<THIRDWEB_CLIENT_ID>\",\n * });\n *\n * const [sendTransaction, { loading, error, data }] = useSendTransaction(thirdwebClient);\n * ```\n *\n * Then, use it to send a {@link TransactionRequest} as shown below.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n *\n * const [toggle, { loading, error, data }] = useEModeToggle();\n *\n * const run = async () => {\n * const result = await toggle({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * user: evmAddress(account!.address),\n * })\n * .andThen(sendTransaction);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Transaction sent with hash:', result.value);\n * };\n * ```\n *\n * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.\n *\n * ```ts\n * const account = useActiveAccount(); // thirdweb hook\n *\n * const [supply, { loading, error, data }] = useSupply();\n *\n * const run = async () => {\n * const result = await supply({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * amount: {\n * erc20: {\n * currency: evmAddress('0x5678…'),\n * value: '42.42',\n * }\n * },\n * supplier: evmAddress(account!.address),\n * })\n * .andThen((plan) => {\n * switch (plan.__typename) {\n * case 'TransactionRequest':\n * return sendTransaction(plan);\n *\n * case 'ApprovalRequired':\n * return sendTransaction(plan.approval).andThen(() =>\n * sendTransaction(plan.originalTransaction),\n * );\n *\n * case 'InsufficientBalanceError':\n * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));\n * }\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Transaction sent with hash:', result.value);\n * }\n * ```\n */\nexport function useSendTransaction(\n thirdwebClient: ThirdwebClient,\n): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError> {\n const client = useAaveClient();\n const switchChain = useSwitchActiveWalletChain();\n const { mutateAsync: sendAndConfirmTx } = useSendAndConfirmTransaction();\n\n return useAsyncTask((request: TransactionRequest) => {\n return ResultAsync.fromPromise(\n switchChain(defineChain({ id: request.chainId })),\n (err) => UnexpectedError.from(err),\n )\n .andThen(() =>\n ResultAsync.fromPromise(\n sendAndConfirmTx({\n to: request.to,\n data: request.data,\n value: BigInt(request.value),\n chain: {\n id: request.chainId,\n rpc: `https://${request.chainId}.rpc.thirdweb.com/${thirdwebClient.clientId}`,\n },\n client: thirdwebClient,\n }),\n (err) => SigningError.from(err),\n ),\n )\n .andThen((receipt) =>\n receipt.status === 'reverted'\n ? TransactionError.new({\n txHash: txHash(receipt.transactionHash),\n request,\n }).asResultAsync()\n : okAsync(txHash(receipt.transactionHash)),\n )\n .map((hash) => ({\n operation: request.operation,\n txHash: hash,\n }))\n .andThen(client.waitForSupportedTransaction);\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 [signERC20Permit, { loading, error, data }] = useERC20Permit();\n *\n * const run = async () => {\n * const result = await signERC20Permit({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * underlyingToken: evmAddress('0x5678…'),\n * amount: '42.42',\n * spender: evmAddress('0x9abc…'),\n * owner: evmAddress(account.address!),\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 permit signed:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(): UseAsyncTask<\n PermitTypedDataRequest,\n ERC712Signature,\n SignERC20PermitError\n> {\n const client = useAaveClient();\n const account = useActiveAccount();\n\n return useAsyncTask((request: PermitTypedDataRequest) => {\n invariant(\n account,\n 'No Account found. Ensure you have connected your wallet.',\n );\n\n return permitTypedData(client, 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}\n"]}
package/dist/viem.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var actions=require('@aave/client/actions'),viem=require('@aave/client/viem'),types=require('@aave/types'),l=require('react');require('urql');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var l__default=/*#__PURE__*/_interopDefault(l);var p=l__default.default.createContext(null);function n(){let e=l.useContext(p);return types.invariant(e,"Could not find Aave SDK context, ensure your code is wrapped in a <AaveProvider>"),e}var o={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){let[r,t]=l.useState(o.Idle());return [l.useCallback(T=>{types.invariant(!r.loading,"Cannot execute a task while another is in progress."),t(({data:a})=>({called:true,loading:true,data:a,error:void 0}));let i=e(T);return i.match(a=>t(o.Success(a)),a=>t(o.Failed(a))),i},[e,r]),r]}function w(e){let r=n();return s(t=>(types.invariant(e,"Expected a WalletClient to handle the operation result."),viem.sendTransactionAndWait(e,t).andThen(r.waitForSupportedTransaction)))}function F(e){let r=n();return s(t=>(types.invariant(e,"Expected a WalletClient to sign ERC20 permits"),actions.permitTypedData(r,t).andThen(viem.signERC20PermitWith(e))))}exports.useERC20Permit=F;exports.useSendTransaction=w;//# sourceMappingURL=viem.cjs.map
2
+ //# sourceMappingURL=viem.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.tsx","../src/helpers/tasks.ts","../src/viem.ts"],"names":["AaveContext","React","useAaveClient","client","useContext","invariant","AsyncTaskState","data","error","useAsyncTask","handler","state","setState","useState","useCallback","input","result","value","useSendTransaction","walletClient","request","sendTransactionAndWait","useERC20Permit","permitTypedData","signERC20PermitWith"],"mappings":"2QAKA,IAAMA,EAAcC,kBAAAA,CAAM,aAAA,CAAiC,IAAI,CAAA,CA2BxD,SAASC,CAAAA,EAA4B,CAC1C,IAAMC,CAAAA,CAASC,YAAAA,CAAWJ,CAAW,CAAA,CAErC,OAAAK,eAAAA,CACEF,EACA,kFACF,CAAA,CAEOA,CACT,CCoBA,IAAMG,CAAAA,CAAiB,CACrB,IAAA,CAAM,KAAqD,CACzD,MAAA,CAAQ,MACR,OAAA,CAAS,KAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,MACT,GACA,OAAA,CAAyBC,CAAAA,GAAiD,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,IAAA,CAAAA,CAAAA,CACA,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,SAASC,CAAAA,CAKdC,CAAAA,CAA2E,CAC3E,GAAM,CAACC,CAAAA,CAAOC,CAAQ,CAAA,CAAIC,UAAAA,CAASP,CAAAA,CAAe,IAAA,EAAsB,CAAA,CA8BxE,OAAO,CA5BSQ,aAAAA,CACbC,CAAAA,EAAkB,CACjBV,eAAAA,CACE,CAACM,EAAM,OAAA,CACP,qDACF,CAAA,CAEAC,CAAAA,CAAS,CAAC,CAAE,IAAA,CAAAL,CAAK,CAAA,IACR,CACL,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,IAAA,CACT,KAAAA,CAAAA,CACA,KAAA,CAAO,MACT,CAAA,CACD,CAAA,CAED,IAAMS,CAAAA,CAASN,CAAAA,CAAQK,CAAK,CAAA,CAE5B,OAAAC,CAAAA,CAAO,KAAA,CACJC,CAAAA,EAAUL,EAASN,CAAAA,CAAe,OAAA,CAAQW,CAAK,CAAC,CAAA,CAChDT,CAAAA,EAAUI,CAAAA,CAASN,CAAAA,CAAe,MAAA,CAAOE,CAAK,CAAC,CAClD,CAAA,CAEOQ,CACT,EACA,CAACN,CAAAA,CAASC,CAAK,CACjB,CAAA,CAEiBA,CAAK,CACxB,CC7DO,SAASO,CAAAA,CACdC,CAAAA,CACgE,CAChE,IAAMhB,CAAAA,CAASD,GAAc,CAE7B,OAAOO,CAAAA,CAAcW,CAAAA,GACnBf,eAAAA,CACEc,CAAAA,CACA,yDACF,CAAA,CAEOE,2BAAAA,CAAuBF,CAAAA,CAAcC,CAAO,CAAA,CAAE,OAAA,CACnDjB,CAAAA,CAAO,2BACT,CAAA,CACD,CACH,CA2BO,SAASmB,CAAAA,CACdH,CAAAA,CAC6E,CAC7E,IAAMhB,CAAAA,CAASD,CAAAA,EAAc,CAE7B,OAAOO,CAAAA,CAAcW,CAAAA,GACnBf,gBAAUc,CAAAA,CAAc,+CAA+C,CAAA,CAEhEI,uBAAAA,CAAgBpB,CAAAA,CAAQiB,CAAO,CAAA,CAAE,OAAA,CACtCI,wBAAAA,CAAoBL,CAAY,CAClC,CAAA,CACD,CACH","file":"viem.cjs","sourcesContent":["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 * Retrieve the injected {@link AaveClient} from the context.\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 { invariant, type ResultAsync } from '@aave/types';\nimport { useCallback, 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>(handler: AsyncTask<TInput, TResult>): UseAsyncTask<TInput, TValue, TError> {\n const [state, setState] = useState(AsyncTaskState.Idle<TValue, TError>());\n\n const execute = useCallback(\n (input: TInput) => {\n invariant(\n !state.loading,\n 'Cannot execute a task while another is in progress.',\n );\n\n setState(({ data }) => {\n return {\n called: true,\n loading: true,\n data,\n error: undefined,\n };\n });\n\n const result = handler(input);\n\n result.match(\n (value) => setState(AsyncTaskState.Success(value)),\n (error) => setState(AsyncTaskState.Failed(error)),\n );\n\n return result;\n },\n [handler, state],\n );\n\n return [execute, state];\n}\n","import type {\n SigningError,\n TimeoutError,\n TransactionError,\n UnexpectedError,\n} from '@aave/client';\nimport { permitTypedData } from '@aave/client/actions';\nimport { sendTransactionAndWait, signERC20PermitWith } from '@aave/client/viem';\nimport type {\n ERC712Signature,\n PermitTypedDataRequest,\n TransactionRequest,\n} from '@aave/graphql';\nimport type { TxHash } from '@aave/types';\nimport { invariant } from '@aave/types';\nimport type { WalletClient } from 'viem';\nimport { useAaveClient } from './context';\nimport { type UseAsyncTask, useAsyncTask } from './helpers';\n\nexport type SendTransactionError =\n | SigningError\n | TimeoutError\n | TransactionError\n | UnexpectedError;\n\n/**\n * A hook that provides a way to send Aave transactions using a viem WalletClient instance.\n *\n * First, 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, { loading, error, data }] = useSendTransaction(wallet);\n * ```\n *\n * Then, use it to send a {@link TransactionRequest} as shown below.\n *\n * ```ts\n * const account = useAccount(); // wagmi hook\n *\n * const [toggle, { loading, error, data }] = useEModeToggle();\n *\n * const run = async () => {\n * const result = await toggle({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * user: evmAddress(account.address!),\n * })\n * .andThen(sendTransaction);\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Transaction sent with hash:', result.value);\n * };\n * ```\n *\n * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.\n *\n * ```ts\n * const account = useAccount(); // wagmi hook\n *\n * const [supply, { loading, error, data }] = useSupply();\n *\n * const run = async () => {\n * const result = await supply({\n * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * amount: {\n * erc20: {\n * currency: evmAddress('0x5678…'),\n * value: '42.42',\n * }\n * },\n * supplier: evmAddress(account.address!),\n * })\n * .andThen((plan) => {\n * switch (plan.__typename) {\n * case 'TransactionRequest':\n * return sendTransaction(plan);\n *\n * case 'ApprovalRequired':\n * return sendTransaction(plan.approval).andThen(() =>\n * sendTransaction(plan.originalTransaction),\n * );\n *\n * case 'InsufficientBalanceError':\n * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));\n * }\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('Transaction sent with hash:', result.value);\n * }\n * ```\n *\n * @param walletClient - The wallet client to use for sending transactions.\n */\nexport function useSendTransaction(\n walletClient: WalletClient | undefined,\n): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError> {\n const client = useAaveClient();\n\n return useAsyncTask((request: TransactionRequest) => {\n invariant(\n walletClient,\n 'Expected a WalletClient to handle the operation result.',\n );\n\n return sendTransactionAndWait(walletClient, request).andThen(\n client.waitForSupportedTransaction,\n );\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 * chainId: chainId(1), // Ethereum mainnet\n * market: evmAddress('0x1234…'),\n * user: evmAddress(account.address!),\n * });\n *\n * if (result.isErr()) {\n * console.error(result.error);\n * return;\n * }\n *\n * console.log('ERC20 permit signed:', result.value);\n * };\n * ```\n */\nexport function useERC20Permit(\n walletClient: WalletClient | undefined,\n): UseAsyncTask<PermitTypedDataRequest, ERC712Signature, SignERC20PermitError> {\n const client = useAaveClient();\n\n return useAsyncTask((request: PermitTypedDataRequest) => {\n invariant(walletClient, 'Expected a WalletClient to sign ERC20 permits');\n\n return permitTypedData(client, request).andThen(\n signERC20PermitWith(walletClient),\n );\n });\n}\n"]}
@@ -0,0 +1,115 @@
1
+ import { SigningError, TimeoutError, TransactionError, UnexpectedError } from '@aave/client';
2
+ import { TransactionRequest, PermitTypedDataRequest, ERC712Signature } from '@aave/graphql';
3
+ import { TxHash } from '@aave/types';
4
+ import { WalletClient } from 'viem';
5
+ import { U as UseAsyncTask } from './tasks-DUn7x8pK.cjs';
6
+
7
+ type SendTransactionError = SigningError | TimeoutError | TransactionError | UnexpectedError;
8
+ /**
9
+ * A hook that provides a way to send Aave transactions using a viem WalletClient instance.
10
+ *
11
+ * First, 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.
12
+ *
13
+ * ```ts
14
+ * const { data: wallet } = useWalletClient(); // wagmi hook
15
+ *
16
+ * const [sendTransaction, { loading, error, data }] = useSendTransaction(wallet);
17
+ * ```
18
+ *
19
+ * Then, use it to send a {@link TransactionRequest} as shown below.
20
+ *
21
+ * ```ts
22
+ * const account = useAccount(); // wagmi hook
23
+ *
24
+ * const [toggle, { loading, error, data }] = useEModeToggle();
25
+ *
26
+ * const run = async () => {
27
+ * const result = await toggle({
28
+ * chainId: chainId(1), // Ethereum mainnet
29
+ * market: evmAddress('0x1234…'),
30
+ * user: evmAddress(account.address!),
31
+ * })
32
+ * .andThen(sendTransaction);
33
+ *
34
+ * if (result.isErr()) {
35
+ * console.error(result.error);
36
+ * return;
37
+ * }
38
+ *
39
+ * console.log('Transaction sent with hash:', result.value);
40
+ * };
41
+ * ```
42
+ *
43
+ * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.
44
+ *
45
+ * ```ts
46
+ * const account = useAccount(); // wagmi hook
47
+ *
48
+ * const [supply, { loading, error, data }] = useSupply();
49
+ *
50
+ * const run = async () => {
51
+ * const result = await supply({
52
+ * chainId: chainId(1), // Ethereum mainnet
53
+ * market: evmAddress('0x1234…'),
54
+ * amount: {
55
+ * erc20: {
56
+ * currency: evmAddress('0x5678…'),
57
+ * value: '42.42',
58
+ * }
59
+ * },
60
+ * supplier: evmAddress(account.address!),
61
+ * })
62
+ * .andThen((plan) => {
63
+ * switch (plan.__typename) {
64
+ * case 'TransactionRequest':
65
+ * return sendTransaction(plan);
66
+ *
67
+ * case 'ApprovalRequired':
68
+ * return sendTransaction(plan.approval).andThen(() =>
69
+ * sendTransaction(plan.originalTransaction),
70
+ * );
71
+ *
72
+ * case 'InsufficientBalanceError':
73
+ * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));
74
+ * }
75
+ * });
76
+ *
77
+ * if (result.isErr()) {
78
+ * console.error(result.error);
79
+ * return;
80
+ * }
81
+ *
82
+ * console.log('Transaction sent with hash:', result.value);
83
+ * }
84
+ * ```
85
+ *
86
+ * @param walletClient - The wallet client to use for sending transactions.
87
+ */
88
+ declare function useSendTransaction(walletClient: WalletClient | undefined): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError>;
89
+ type SignERC20PermitError = SigningError | UnexpectedError;
90
+ /**
91
+ * A hook that provides a way to sign ERC20 permits using a viem WalletClient instance.
92
+ *
93
+ * ```ts
94
+ * const { data: wallet } = useWalletClient(); // wagmi hook
95
+ * const [signERC20Permit, { loading, error, data }] = useERC20Permit(wallet);
96
+ *
97
+ * const run = async () => {
98
+ * const result = await signERC20Permit({
99
+ * chainId: chainId(1), // Ethereum mainnet
100
+ * market: evmAddress('0x1234…'),
101
+ * user: evmAddress(account.address!),
102
+ * });
103
+ *
104
+ * if (result.isErr()) {
105
+ * console.error(result.error);
106
+ * return;
107
+ * }
108
+ *
109
+ * console.log('ERC20 permit signed:', result.value);
110
+ * };
111
+ * ```
112
+ */
113
+ declare function useERC20Permit(walletClient: WalletClient | undefined): UseAsyncTask<PermitTypedDataRequest, ERC712Signature, SignERC20PermitError>;
114
+
115
+ export { type SendTransactionError, type SignERC20PermitError, useERC20Permit, useSendTransaction };
package/dist/viem.d.ts ADDED
@@ -0,0 +1,115 @@
1
+ import { SigningError, TimeoutError, TransactionError, UnexpectedError } from '@aave/client';
2
+ import { TransactionRequest, PermitTypedDataRequest, ERC712Signature } from '@aave/graphql';
3
+ import { TxHash } from '@aave/types';
4
+ import { WalletClient } from 'viem';
5
+ import { U as UseAsyncTask } from './tasks-DUn7x8pK.js';
6
+
7
+ type SendTransactionError = SigningError | TimeoutError | TransactionError | UnexpectedError;
8
+ /**
9
+ * A hook that provides a way to send Aave transactions using a viem WalletClient instance.
10
+ *
11
+ * First, 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.
12
+ *
13
+ * ```ts
14
+ * const { data: wallet } = useWalletClient(); // wagmi hook
15
+ *
16
+ * const [sendTransaction, { loading, error, data }] = useSendTransaction(wallet);
17
+ * ```
18
+ *
19
+ * Then, use it to send a {@link TransactionRequest} as shown below.
20
+ *
21
+ * ```ts
22
+ * const account = useAccount(); // wagmi hook
23
+ *
24
+ * const [toggle, { loading, error, data }] = useEModeToggle();
25
+ *
26
+ * const run = async () => {
27
+ * const result = await toggle({
28
+ * chainId: chainId(1), // Ethereum mainnet
29
+ * market: evmAddress('0x1234…'),
30
+ * user: evmAddress(account.address!),
31
+ * })
32
+ * .andThen(sendTransaction);
33
+ *
34
+ * if (result.isErr()) {
35
+ * console.error(result.error);
36
+ * return;
37
+ * }
38
+ *
39
+ * console.log('Transaction sent with hash:', result.value);
40
+ * };
41
+ * ```
42
+ *
43
+ * Or use it to handle an {@link ExecutionPlan} that may require multiple transactions as shown below.
44
+ *
45
+ * ```ts
46
+ * const account = useAccount(); // wagmi hook
47
+ *
48
+ * const [supply, { loading, error, data }] = useSupply();
49
+ *
50
+ * const run = async () => {
51
+ * const result = await supply({
52
+ * chainId: chainId(1), // Ethereum mainnet
53
+ * market: evmAddress('0x1234…'),
54
+ * amount: {
55
+ * erc20: {
56
+ * currency: evmAddress('0x5678…'),
57
+ * value: '42.42',
58
+ * }
59
+ * },
60
+ * supplier: evmAddress(account.address!),
61
+ * })
62
+ * .andThen((plan) => {
63
+ * switch (plan.__typename) {
64
+ * case 'TransactionRequest':
65
+ * return sendTransaction(plan);
66
+ *
67
+ * case 'ApprovalRequired':
68
+ * return sendTransaction(plan.approval).andThen(() =>
69
+ * sendTransaction(plan.originalTransaction),
70
+ * );
71
+ *
72
+ * case 'InsufficientBalanceError':
73
+ * return errAsync(new Error(`Insufficient balance: ${error.cause.required.value} required.`));
74
+ * }
75
+ * });
76
+ *
77
+ * if (result.isErr()) {
78
+ * console.error(result.error);
79
+ * return;
80
+ * }
81
+ *
82
+ * console.log('Transaction sent with hash:', result.value);
83
+ * }
84
+ * ```
85
+ *
86
+ * @param walletClient - The wallet client to use for sending transactions.
87
+ */
88
+ declare function useSendTransaction(walletClient: WalletClient | undefined): UseAsyncTask<TransactionRequest, TxHash, SendTransactionError>;
89
+ type SignERC20PermitError = SigningError | UnexpectedError;
90
+ /**
91
+ * A hook that provides a way to sign ERC20 permits using a viem WalletClient instance.
92
+ *
93
+ * ```ts
94
+ * const { data: wallet } = useWalletClient(); // wagmi hook
95
+ * const [signERC20Permit, { loading, error, data }] = useERC20Permit(wallet);
96
+ *
97
+ * const run = async () => {
98
+ * const result = await signERC20Permit({
99
+ * chainId: chainId(1), // Ethereum mainnet
100
+ * market: evmAddress('0x1234…'),
101
+ * user: evmAddress(account.address!),
102
+ * });
103
+ *
104
+ * if (result.isErr()) {
105
+ * console.error(result.error);
106
+ * return;
107
+ * }
108
+ *
109
+ * console.log('ERC20 permit signed:', result.value);
110
+ * };
111
+ * ```
112
+ */
113
+ declare function useERC20Permit(walletClient: WalletClient | undefined): UseAsyncTask<PermitTypedDataRequest, ERC712Signature, SignERC20PermitError>;
114
+
115
+ export { type SendTransactionError, type SignERC20PermitError, useERC20Permit, useSendTransaction };