@cfxdevkit/react 1.0.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,198 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/hooks/index.ts
21
+ var hooks_exports = {};
22
+ __export(hooks_exports, {
23
+ useBalance: () => useBalance,
24
+ useContract: () => useContract,
25
+ useTransaction: () => useTransaction
26
+ });
27
+ module.exports = __toCommonJS(hooks_exports);
28
+
29
+ // src/hooks/useBalance.ts
30
+ var import_react2 = require("react");
31
+
32
+ // src/providers/DevKitProvider.tsx
33
+ var import_react = require("react");
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var DevKitContext = (0, import_react.createContext)(void 0);
36
+ function useDevKitContext() {
37
+ const context = (0, import_react.useContext)(DevKitContext);
38
+ if (!context) {
39
+ throw new Error("useDevKitContext must be used within DevKitProvider");
40
+ }
41
+ return context;
42
+ }
43
+
44
+ // src/hooks/useBalance.ts
45
+ function useBalance(options) {
46
+ const { address, enabled = true, refreshInterval } = options;
47
+ useDevKitContext();
48
+ const [balance, setBalance] = (0, import_react2.useState)();
49
+ const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
50
+ const [error, setError] = (0, import_react2.useState)();
51
+ const fetchBalance = (0, import_react2.useCallback)(async () => {
52
+ if (!address || !enabled) return;
53
+ setIsLoading(true);
54
+ setError(void 0);
55
+ try {
56
+ const mockBalance = "1000000000000000000";
57
+ setBalance(mockBalance);
58
+ } catch (err) {
59
+ setError(
60
+ err instanceof Error ? err : new Error("Failed to fetch balance")
61
+ );
62
+ } finally {
63
+ setIsLoading(false);
64
+ }
65
+ }, [address, enabled]);
66
+ (0, import_react2.useEffect)(() => {
67
+ void fetchBalance();
68
+ if (refreshInterval) {
69
+ const interval = setInterval(() => {
70
+ void fetchBalance();
71
+ }, refreshInterval);
72
+ return () => clearInterval(interval);
73
+ }
74
+ }, [fetchBalance, refreshInterval]);
75
+ return {
76
+ balance,
77
+ isLoading,
78
+ error,
79
+ refetch: fetchBalance
80
+ };
81
+ }
82
+
83
+ // src/hooks/useContract.ts
84
+ var import_react4 = require("react");
85
+
86
+ // src/providers/WalletProvider.tsx
87
+ var import_react3 = require("react");
88
+ var import_jsx_runtime2 = require("react/jsx-runtime");
89
+ var WalletContext = (0, import_react3.createContext)(void 0);
90
+ function useWalletContext() {
91
+ const context = (0, import_react3.useContext)(WalletContext);
92
+ if (!context) {
93
+ throw new Error("useWalletContext must be used within WalletProvider");
94
+ }
95
+ return context;
96
+ }
97
+
98
+ // src/hooks/useContract.ts
99
+ function useContract() {
100
+ useDevKitContext();
101
+ const { accountIndex } = useWalletContext();
102
+ const [isLoading, setIsLoading] = (0, import_react4.useState)(false);
103
+ const [error, setError] = (0, import_react4.useState)();
104
+ const read = async (_options) => {
105
+ setIsLoading(true);
106
+ setError(void 0);
107
+ try {
108
+ return {};
109
+ } catch (err) {
110
+ const errorObj = err instanceof Error ? err : new Error("Contract read failed");
111
+ setError(errorObj);
112
+ throw errorObj;
113
+ } finally {
114
+ setIsLoading(false);
115
+ }
116
+ };
117
+ const write = async (_options) => {
118
+ if (accountIndex === void 0) {
119
+ throw new Error("Wallet not connected");
120
+ }
121
+ setIsLoading(true);
122
+ setError(void 0);
123
+ try {
124
+ const hash = `0x${Array.from(
125
+ { length: 64 },
126
+ () => Math.floor(Math.random() * 16).toString(16)
127
+ ).join("")}`;
128
+ return hash;
129
+ } catch (err) {
130
+ const errorObj = err instanceof Error ? err : new Error("Contract write failed");
131
+ setError(errorObj);
132
+ throw errorObj;
133
+ } finally {
134
+ setIsLoading(false);
135
+ }
136
+ };
137
+ return {
138
+ read,
139
+ write,
140
+ isLoading,
141
+ error
142
+ };
143
+ }
144
+
145
+ // src/hooks/useTransaction.ts
146
+ var import_react5 = require("react");
147
+ function useTransaction() {
148
+ useDevKitContext();
149
+ const { accountIndex } = useWalletContext();
150
+ const [isLoading, setIsLoading] = (0, import_react5.useState)(false);
151
+ const [error, setError] = (0, import_react5.useState)();
152
+ const [transaction, setTransaction] = (0, import_react5.useState)();
153
+ const send = async (_options) => {
154
+ if (accountIndex === void 0) {
155
+ throw new Error("Wallet not connected");
156
+ }
157
+ setIsLoading(true);
158
+ setError(void 0);
159
+ try {
160
+ const result = {
161
+ hash: `0x${Array.from(
162
+ { length: 64 },
163
+ () => Math.floor(Math.random() * 16).toString(16)
164
+ ).join("")}`,
165
+ status: "pending"
166
+ };
167
+ setTransaction(result);
168
+ setTimeout(() => {
169
+ setTransaction({ ...result, status: "success" });
170
+ }, 2e3);
171
+ return result;
172
+ } catch (err) {
173
+ const errorObj = err instanceof Error ? err : new Error("Transaction failed");
174
+ setError(errorObj);
175
+ throw errorObj;
176
+ } finally {
177
+ setIsLoading(false);
178
+ }
179
+ };
180
+ const reset = () => {
181
+ setTransaction(void 0);
182
+ setError(void 0);
183
+ };
184
+ return {
185
+ send,
186
+ isLoading,
187
+ error,
188
+ transaction,
189
+ reset
190
+ };
191
+ }
192
+ // Annotate the CommonJS export names for ESM import in node:
193
+ 0 && (module.exports = {
194
+ useBalance,
195
+ useContract,
196
+ useTransaction
197
+ });
198
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/useBalance.ts","../../src/providers/DevKitProvider.tsx","../../src/hooks/useContract.ts","../../src/providers/WalletProvider.tsx","../../src/hooks/useTransaction.ts"],"sourcesContent":["/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type { UseBalanceOptions, UseBalanceReturn } from './useBalance.js';\nexport { useBalance } from './useBalance.js';\nexport type {\n ReadContractOptions,\n UseContractReturn,\n WriteContractOptions,\n} from './useContract.js';\nexport { useContract } from './useContract.js';\nexport type {\n SendTransactionOptions,\n TransactionResult,\n UseTransactionReturn,\n} from './useTransaction.js';\nexport { useTransaction } from './useTransaction.js';\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * useBalance Hook\n *\n * Fetches and tracks balance for an address\n */\n\nimport type { ChainType } from '@cfxdevkit/core';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useDevKitContext } from '../providers/DevKitProvider.js';\n\nexport interface UseBalanceOptions {\n address?: string;\n chain: ChainType;\n enabled?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseBalanceReturn {\n balance?: string;\n isLoading: boolean;\n error?: Error;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to fetch and track address balance\n *\n * @example\n * ```tsx\n * const { balance, isLoading } = useBalance({\n * address: '0x...',\n * chain: 'evm'\n * });\n * ```\n */\nexport function useBalance(options: UseBalanceOptions): UseBalanceReturn {\n const { address, enabled = true, refreshInterval } = options;\n useDevKitContext(); // ensure provider is present; apiUrl and chain used in production impl\n\n const [balance, setBalance] = useState<string>();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error>();\n\n const fetchBalance = useCallback(async () => {\n if (!address || !enabled) return;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n // In production, call backend API with `chain` to select Core vs eSpace\n // For now, simulate balance fetch\n const mockBalance = '1000000000000000000'; // 1 token\n setBalance(mockBalance);\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to fetch balance')\n );\n } finally {\n setIsLoading(false);\n }\n }, [address, enabled]);\n\n useEffect(() => {\n void fetchBalance();\n\n // Set up refresh interval if provided\n if (refreshInterval) {\n const interval = setInterval(() => {\n void fetchBalance();\n }, refreshInterval);\n return () => clearInterval(interval);\n }\n }, [fetchBalance, refreshInterval]);\n\n return {\n balance,\n isLoading,\n error,\n refetch: fetchBalance,\n };\n}\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * DevKit Provider\n *\n * Provides DevKit instance and configuration to all child components\n */\n\nimport { createContext, type ReactNode, useContext } from 'react';\n\nexport interface DevKitContextValue {\n /** Backend API URL */\n apiUrl: string;\n /** WebSocket URL */\n wsUrl?: string;\n /** Current network */\n network: 'local' | 'testnet' | 'mainnet';\n /** Enable debug mode */\n debug?: boolean;\n}\n\nconst DevKitContext = createContext<DevKitContextValue | undefined>(undefined);\n\nexport interface DevKitProviderProps {\n apiUrl: string;\n wsUrl?: string;\n network?: 'local' | 'testnet' | 'mainnet';\n debug?: boolean;\n children: ReactNode;\n}\n\n/**\n * DevKit Provider Component\n *\n * Wrap your app with this provider to enable DevKit functionality\n *\n * @example\n * ```tsx\n * <DevKitProvider apiUrl=\"http://localhost:3000\" network=\"local\">\n * <App />\n * </DevKitProvider>\n * ```\n */\nexport function DevKitProvider({\n apiUrl,\n wsUrl,\n network = 'local',\n debug = false,\n children,\n}: DevKitProviderProps) {\n const value: DevKitContextValue = {\n apiUrl,\n wsUrl,\n network,\n debug,\n };\n\n return (\n <DevKitContext.Provider value={value}>{children}</DevKitContext.Provider>\n );\n}\n\n/**\n * Hook to access DevKit context\n *\n * @throws Error if used outside DevKitProvider\n */\nexport function useDevKitContext() {\n const context = useContext(DevKitContext);\n if (!context) {\n throw new Error('useDevKitContext must be used within DevKitProvider');\n }\n return context;\n}\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * useContract Hook\n *\n * Interact with smart contracts (read and write)\n */\n\nimport type { ChainType } from '@cfxdevkit/core';\nimport { useState } from 'react';\nimport { useDevKitContext } from '../providers/DevKitProvider.js';\nimport { useWalletContext } from '../providers/WalletProvider.js';\n\nexport interface ReadContractOptions {\n address: string;\n abi: unknown[];\n functionName: string;\n args?: unknown[];\n chain: ChainType;\n}\n\nexport interface WriteContractOptions extends ReadContractOptions {\n value?: string;\n}\n\nexport interface UseContractReturn {\n read: <T = unknown>(options: ReadContractOptions) => Promise<T>;\n write: (options: WriteContractOptions) => Promise<string>;\n isLoading: boolean;\n error?: Error;\n}\n\n/**\n * Hook to interact with smart contracts\n *\n * @example\n * ```tsx\n * const { read, write, isLoading } = useContract();\n *\n * // Read contract\n * const balance = await read({\n * address: '0x...',\n * abi: ERC20_ABI,\n * functionName: 'balanceOf',\n * args: ['0x...'],\n * chain: 'evm'\n * });\n *\n * // Write contract\n * const hash = await write({\n * address: '0x...',\n * abi: ERC20_ABI,\n * functionName: 'transfer',\n * args: ['0x...', '1000000000000000000'],\n * chain: 'evm'\n * });\n * ```\n */\nexport function useContract(): UseContractReturn {\n useDevKitContext(); // ensure provider is present; apiUrl used in production impl\n const { accountIndex } = useWalletContext();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error>();\n\n const read = async <T = unknown>(\n _options: ReadContractOptions\n ): Promise<T> => {\n setIsLoading(true);\n setError(undefined);\n\n try {\n // In production, call backend API\n // For now, return mock data\n return {} as T;\n } catch (err) {\n const errorObj =\n err instanceof Error ? err : new Error('Contract read failed');\n setError(errorObj);\n throw errorObj;\n } finally {\n setIsLoading(false);\n }\n };\n\n const write = async (_options: WriteContractOptions): Promise<string> => {\n if (accountIndex === undefined) {\n throw new Error('Wallet not connected');\n }\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n // In production, call backend API\n // For now, return mock hash\n const hash = `0x${Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('')}`;\n\n return hash;\n } catch (err) {\n const errorObj =\n err instanceof Error ? err : new Error('Contract write failed');\n setError(errorObj);\n throw errorObj;\n } finally {\n setIsLoading(false);\n }\n };\n\n return {\n read,\n write,\n isLoading,\n error,\n };\n}\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Wallet Provider\n *\n * Manages wallet connection state and provides wallet-related functionality\n */\n\nimport type { ChainType } from '@cfxdevkit/core';\nimport { createContext, type ReactNode, useContext, useState } from 'react';\n\nexport interface WalletContextValue {\n isConnected: boolean;\n address?: string;\n coreAddress?: string;\n evmAddress?: string;\n chain?: ChainType;\n accountIndex?: number;\n connect: (accountIndex: number) => Promise<void>;\n disconnect: () => void;\n switchChain: (chain: ChainType) => void;\n}\n\nconst WalletContext = createContext<WalletContextValue | undefined>(undefined);\n\nexport interface WalletProviderProps {\n children: ReactNode;\n}\n\n/**\n * Wallet Provider Component\n *\n * Manages wallet connection state\n *\n * @example\n * ```tsx\n * <WalletProvider>\n * <ConnectButton />\n * <AccountCard />\n * </WalletProvider>\n * ```\n */\nexport function WalletProvider({ children }: WalletProviderProps) {\n const [isConnected, setIsConnected] = useState(false);\n const [coreAddress, setCoreAddress] = useState<string>();\n const [evmAddress, setEvmAddress] = useState<string>();\n const [chain, setChain] = useState<ChainType>('evm');\n const [accountIndex, setAccountIndex] = useState<number>();\n\n const connect = async (index: number) => {\n // In production, this would fetch account info from backend\n // For now, simulate connection\n setAccountIndex(index);\n setCoreAddress(`cfx:account${index}`);\n setEvmAddress(`0xaccount${index}`);\n setIsConnected(true);\n };\n\n const disconnect = () => {\n setIsConnected(false);\n setCoreAddress(undefined);\n setEvmAddress(undefined);\n setAccountIndex(undefined);\n };\n\n const switchChain = (newChain: ChainType) => {\n setChain(newChain);\n };\n\n const value: WalletContextValue = {\n isConnected,\n address: chain === 'core' ? coreAddress : evmAddress,\n coreAddress,\n evmAddress,\n chain,\n accountIndex,\n connect,\n disconnect,\n switchChain,\n };\n\n return (\n <WalletContext.Provider value={value}>{children}</WalletContext.Provider>\n );\n}\n\n/**\n * Hook to access Wallet context\n *\n * @throws Error if used outside WalletProvider\n */\nexport function useWalletContext() {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error('useWalletContext must be used within WalletProvider');\n }\n return context;\n}\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * useTransaction Hook\n *\n * Sends transactions and tracks their status\n */\n\nimport type { ChainType } from '@cfxdevkit/core';\nimport { useState } from 'react';\nimport { useDevKitContext } from '../providers/DevKitProvider.js';\nimport { useWalletContext } from '../providers/WalletProvider.js';\n\nexport interface SendTransactionOptions {\n to: string;\n value?: string;\n data?: string;\n chain?: ChainType;\n}\n\nexport interface TransactionResult {\n hash: string;\n status: 'pending' | 'success' | 'failed';\n}\n\nexport interface UseTransactionReturn {\n send: (options: SendTransactionOptions) => Promise<TransactionResult>;\n isLoading: boolean;\n error?: Error;\n transaction?: TransactionResult;\n reset: () => void;\n}\n\n/**\n * Hook to send transactions\n *\n * @example\n * ```tsx\n * const { send, isLoading, transaction } = useTransaction();\n *\n * const handleSend = async () => {\n * const result = await send({\n * to: '0x...',\n * value: '1000000000000000000',\n * chain: 'evm'\n * });\n * };\n * ```\n */\nexport function useTransaction(): UseTransactionReturn {\n useDevKitContext(); // ensure provider is present; apiUrl used in production impl\n const { accountIndex } = useWalletContext();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error>();\n const [transaction, setTransaction] = useState<TransactionResult>();\n\n const send = async (\n _options: SendTransactionOptions\n ): Promise<TransactionResult> => {\n if (accountIndex === undefined) {\n throw new Error('Wallet not connected');\n }\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n // In production, call backend API to send transaction\n // For now, simulate transaction\n const result: TransactionResult = {\n hash: `0x${Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('')}`,\n status: 'pending',\n };\n\n setTransaction(result);\n\n // Simulate confirmation\n setTimeout(() => {\n setTransaction({ ...result, status: 'success' });\n }, 2000);\n\n return result;\n } catch (err) {\n const errorObj =\n err instanceof Error ? err : new Error('Transaction failed');\n setError(errorObj);\n throw errorObj;\n } finally {\n setIsLoading(false);\n }\n };\n\n const reset = () => {\n setTransaction(undefined);\n setError(undefined);\n };\n\n return {\n send,\n isLoading,\n error,\n transaction,\n reset,\n };\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","import_react"]}
@@ -0,0 +1,125 @@
1
+ import { ChainType } from '@cfxdevkit/core';
2
+
3
+ /**
4
+ * useBalance Hook
5
+ *
6
+ * Fetches and tracks balance for an address
7
+ */
8
+
9
+ interface UseBalanceOptions {
10
+ address?: string;
11
+ chain: ChainType;
12
+ enabled?: boolean;
13
+ refreshInterval?: number;
14
+ }
15
+ interface UseBalanceReturn {
16
+ balance?: string;
17
+ isLoading: boolean;
18
+ error?: Error;
19
+ refetch: () => Promise<void>;
20
+ }
21
+ /**
22
+ * Hook to fetch and track address balance
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const { balance, isLoading } = useBalance({
27
+ * address: '0x...',
28
+ * chain: 'evm'
29
+ * });
30
+ * ```
31
+ */
32
+ declare function useBalance(options: UseBalanceOptions): UseBalanceReturn;
33
+
34
+ /**
35
+ * useContract Hook
36
+ *
37
+ * Interact with smart contracts (read and write)
38
+ */
39
+
40
+ interface ReadContractOptions {
41
+ address: string;
42
+ abi: unknown[];
43
+ functionName: string;
44
+ args?: unknown[];
45
+ chain: ChainType;
46
+ }
47
+ interface WriteContractOptions extends ReadContractOptions {
48
+ value?: string;
49
+ }
50
+ interface UseContractReturn {
51
+ read: <T = unknown>(options: ReadContractOptions) => Promise<T>;
52
+ write: (options: WriteContractOptions) => Promise<string>;
53
+ isLoading: boolean;
54
+ error?: Error;
55
+ }
56
+ /**
57
+ * Hook to interact with smart contracts
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * const { read, write, isLoading } = useContract();
62
+ *
63
+ * // Read contract
64
+ * const balance = await read({
65
+ * address: '0x...',
66
+ * abi: ERC20_ABI,
67
+ * functionName: 'balanceOf',
68
+ * args: ['0x...'],
69
+ * chain: 'evm'
70
+ * });
71
+ *
72
+ * // Write contract
73
+ * const hash = await write({
74
+ * address: '0x...',
75
+ * abi: ERC20_ABI,
76
+ * functionName: 'transfer',
77
+ * args: ['0x...', '1000000000000000000'],
78
+ * chain: 'evm'
79
+ * });
80
+ * ```
81
+ */
82
+ declare function useContract(): UseContractReturn;
83
+
84
+ /**
85
+ * useTransaction Hook
86
+ *
87
+ * Sends transactions and tracks their status
88
+ */
89
+
90
+ interface SendTransactionOptions {
91
+ to: string;
92
+ value?: string;
93
+ data?: string;
94
+ chain?: ChainType;
95
+ }
96
+ interface TransactionResult {
97
+ hash: string;
98
+ status: 'pending' | 'success' | 'failed';
99
+ }
100
+ interface UseTransactionReturn {
101
+ send: (options: SendTransactionOptions) => Promise<TransactionResult>;
102
+ isLoading: boolean;
103
+ error?: Error;
104
+ transaction?: TransactionResult;
105
+ reset: () => void;
106
+ }
107
+ /**
108
+ * Hook to send transactions
109
+ *
110
+ * @example
111
+ * ```tsx
112
+ * const { send, isLoading, transaction } = useTransaction();
113
+ *
114
+ * const handleSend = async () => {
115
+ * const result = await send({
116
+ * to: '0x...',
117
+ * value: '1000000000000000000',
118
+ * chain: 'evm'
119
+ * });
120
+ * };
121
+ * ```
122
+ */
123
+ declare function useTransaction(): UseTransactionReturn;
124
+
125
+ export { type ReadContractOptions, type SendTransactionOptions, type TransactionResult, type UseBalanceOptions, type UseBalanceReturn, type UseContractReturn, type UseTransactionReturn, type WriteContractOptions, useBalance, useContract, useTransaction };
@@ -0,0 +1,125 @@
1
+ import { ChainType } from '@cfxdevkit/core';
2
+
3
+ /**
4
+ * useBalance Hook
5
+ *
6
+ * Fetches and tracks balance for an address
7
+ */
8
+
9
+ interface UseBalanceOptions {
10
+ address?: string;
11
+ chain: ChainType;
12
+ enabled?: boolean;
13
+ refreshInterval?: number;
14
+ }
15
+ interface UseBalanceReturn {
16
+ balance?: string;
17
+ isLoading: boolean;
18
+ error?: Error;
19
+ refetch: () => Promise<void>;
20
+ }
21
+ /**
22
+ * Hook to fetch and track address balance
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const { balance, isLoading } = useBalance({
27
+ * address: '0x...',
28
+ * chain: 'evm'
29
+ * });
30
+ * ```
31
+ */
32
+ declare function useBalance(options: UseBalanceOptions): UseBalanceReturn;
33
+
34
+ /**
35
+ * useContract Hook
36
+ *
37
+ * Interact with smart contracts (read and write)
38
+ */
39
+
40
+ interface ReadContractOptions {
41
+ address: string;
42
+ abi: unknown[];
43
+ functionName: string;
44
+ args?: unknown[];
45
+ chain: ChainType;
46
+ }
47
+ interface WriteContractOptions extends ReadContractOptions {
48
+ value?: string;
49
+ }
50
+ interface UseContractReturn {
51
+ read: <T = unknown>(options: ReadContractOptions) => Promise<T>;
52
+ write: (options: WriteContractOptions) => Promise<string>;
53
+ isLoading: boolean;
54
+ error?: Error;
55
+ }
56
+ /**
57
+ * Hook to interact with smart contracts
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * const { read, write, isLoading } = useContract();
62
+ *
63
+ * // Read contract
64
+ * const balance = await read({
65
+ * address: '0x...',
66
+ * abi: ERC20_ABI,
67
+ * functionName: 'balanceOf',
68
+ * args: ['0x...'],
69
+ * chain: 'evm'
70
+ * });
71
+ *
72
+ * // Write contract
73
+ * const hash = await write({
74
+ * address: '0x...',
75
+ * abi: ERC20_ABI,
76
+ * functionName: 'transfer',
77
+ * args: ['0x...', '1000000000000000000'],
78
+ * chain: 'evm'
79
+ * });
80
+ * ```
81
+ */
82
+ declare function useContract(): UseContractReturn;
83
+
84
+ /**
85
+ * useTransaction Hook
86
+ *
87
+ * Sends transactions and tracks their status
88
+ */
89
+
90
+ interface SendTransactionOptions {
91
+ to: string;
92
+ value?: string;
93
+ data?: string;
94
+ chain?: ChainType;
95
+ }
96
+ interface TransactionResult {
97
+ hash: string;
98
+ status: 'pending' | 'success' | 'failed';
99
+ }
100
+ interface UseTransactionReturn {
101
+ send: (options: SendTransactionOptions) => Promise<TransactionResult>;
102
+ isLoading: boolean;
103
+ error?: Error;
104
+ transaction?: TransactionResult;
105
+ reset: () => void;
106
+ }
107
+ /**
108
+ * Hook to send transactions
109
+ *
110
+ * @example
111
+ * ```tsx
112
+ * const { send, isLoading, transaction } = useTransaction();
113
+ *
114
+ * const handleSend = async () => {
115
+ * const result = await send({
116
+ * to: '0x...',
117
+ * value: '1000000000000000000',
118
+ * chain: 'evm'
119
+ * });
120
+ * };
121
+ * ```
122
+ */
123
+ declare function useTransaction(): UseTransactionReturn;
124
+
125
+ export { type ReadContractOptions, type SendTransactionOptions, type TransactionResult, type UseBalanceOptions, type UseBalanceReturn, type UseContractReturn, type UseTransactionReturn, type WriteContractOptions, useBalance, useContract, useTransaction };
@@ -0,0 +1,169 @@
1
+ // src/hooks/useBalance.ts
2
+ import { useCallback, useEffect, useState } from "react";
3
+
4
+ // src/providers/DevKitProvider.tsx
5
+ import { createContext, useContext } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ var DevKitContext = createContext(void 0);
8
+ function useDevKitContext() {
9
+ const context = useContext(DevKitContext);
10
+ if (!context) {
11
+ throw new Error("useDevKitContext must be used within DevKitProvider");
12
+ }
13
+ return context;
14
+ }
15
+
16
+ // src/hooks/useBalance.ts
17
+ function useBalance(options) {
18
+ const { address, enabled = true, refreshInterval } = options;
19
+ useDevKitContext();
20
+ const [balance, setBalance] = useState();
21
+ const [isLoading, setIsLoading] = useState(false);
22
+ const [error, setError] = useState();
23
+ const fetchBalance = useCallback(async () => {
24
+ if (!address || !enabled) return;
25
+ setIsLoading(true);
26
+ setError(void 0);
27
+ try {
28
+ const mockBalance = "1000000000000000000";
29
+ setBalance(mockBalance);
30
+ } catch (err) {
31
+ setError(
32
+ err instanceof Error ? err : new Error("Failed to fetch balance")
33
+ );
34
+ } finally {
35
+ setIsLoading(false);
36
+ }
37
+ }, [address, enabled]);
38
+ useEffect(() => {
39
+ void fetchBalance();
40
+ if (refreshInterval) {
41
+ const interval = setInterval(() => {
42
+ void fetchBalance();
43
+ }, refreshInterval);
44
+ return () => clearInterval(interval);
45
+ }
46
+ }, [fetchBalance, refreshInterval]);
47
+ return {
48
+ balance,
49
+ isLoading,
50
+ error,
51
+ refetch: fetchBalance
52
+ };
53
+ }
54
+
55
+ // src/hooks/useContract.ts
56
+ import { useState as useState3 } from "react";
57
+
58
+ // src/providers/WalletProvider.tsx
59
+ import { createContext as createContext2, useContext as useContext2, useState as useState2 } from "react";
60
+ import { jsx as jsx2 } from "react/jsx-runtime";
61
+ var WalletContext = createContext2(void 0);
62
+ function useWalletContext() {
63
+ const context = useContext2(WalletContext);
64
+ if (!context) {
65
+ throw new Error("useWalletContext must be used within WalletProvider");
66
+ }
67
+ return context;
68
+ }
69
+
70
+ // src/hooks/useContract.ts
71
+ function useContract() {
72
+ useDevKitContext();
73
+ const { accountIndex } = useWalletContext();
74
+ const [isLoading, setIsLoading] = useState3(false);
75
+ const [error, setError] = useState3();
76
+ const read = async (_options) => {
77
+ setIsLoading(true);
78
+ setError(void 0);
79
+ try {
80
+ return {};
81
+ } catch (err) {
82
+ const errorObj = err instanceof Error ? err : new Error("Contract read failed");
83
+ setError(errorObj);
84
+ throw errorObj;
85
+ } finally {
86
+ setIsLoading(false);
87
+ }
88
+ };
89
+ const write = async (_options) => {
90
+ if (accountIndex === void 0) {
91
+ throw new Error("Wallet not connected");
92
+ }
93
+ setIsLoading(true);
94
+ setError(void 0);
95
+ try {
96
+ const hash = `0x${Array.from(
97
+ { length: 64 },
98
+ () => Math.floor(Math.random() * 16).toString(16)
99
+ ).join("")}`;
100
+ return hash;
101
+ } catch (err) {
102
+ const errorObj = err instanceof Error ? err : new Error("Contract write failed");
103
+ setError(errorObj);
104
+ throw errorObj;
105
+ } finally {
106
+ setIsLoading(false);
107
+ }
108
+ };
109
+ return {
110
+ read,
111
+ write,
112
+ isLoading,
113
+ error
114
+ };
115
+ }
116
+
117
+ // src/hooks/useTransaction.ts
118
+ import { useState as useState4 } from "react";
119
+ function useTransaction() {
120
+ useDevKitContext();
121
+ const { accountIndex } = useWalletContext();
122
+ const [isLoading, setIsLoading] = useState4(false);
123
+ const [error, setError] = useState4();
124
+ const [transaction, setTransaction] = useState4();
125
+ const send = async (_options) => {
126
+ if (accountIndex === void 0) {
127
+ throw new Error("Wallet not connected");
128
+ }
129
+ setIsLoading(true);
130
+ setError(void 0);
131
+ try {
132
+ const result = {
133
+ hash: `0x${Array.from(
134
+ { length: 64 },
135
+ () => Math.floor(Math.random() * 16).toString(16)
136
+ ).join("")}`,
137
+ status: "pending"
138
+ };
139
+ setTransaction(result);
140
+ setTimeout(() => {
141
+ setTransaction({ ...result, status: "success" });
142
+ }, 2e3);
143
+ return result;
144
+ } catch (err) {
145
+ const errorObj = err instanceof Error ? err : new Error("Transaction failed");
146
+ setError(errorObj);
147
+ throw errorObj;
148
+ } finally {
149
+ setIsLoading(false);
150
+ }
151
+ };
152
+ const reset = () => {
153
+ setTransaction(void 0);
154
+ setError(void 0);
155
+ };
156
+ return {
157
+ send,
158
+ isLoading,
159
+ error,
160
+ transaction,
161
+ reset
162
+ };
163
+ }
164
+ export {
165
+ useBalance,
166
+ useContract,
167
+ useTransaction
168
+ };
169
+ //# sourceMappingURL=index.js.map