import { useWallet } from "@aptos-labs/wallet-adapter-react"; import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk"; import { currentNetwork } from "../contexts/WalletContext"; // Module configuration - update these for your dApp const MODULE_ADDRESS = import.meta.env.VITE_MODULE_ADDRESS || "0x1"; const MODULE_NAME = import.meta.env.VITE_MODULE_NAME || "module_name"; // Create Aptos client for Movement network const aptosConfig = new AptosConfig({ network: Network.CUSTOM, fullnode: currentNetwork.url, }); const aptos = new Aptos(aptosConfig); export function useContract() { const { signAndSubmitTransaction, account } = useWallet(); /** * Call an entry function on the contract */ const callFunction = async ( functionName: string, args: (string | number | boolean | Uint8Array)[] ) => { if (!account) { throw new Error("Wallet not connected"); } const response = await signAndSubmitTransaction({ data: { function: `${MODULE_ADDRESS}::${MODULE_NAME}::${functionName}`, functionArguments: args, }, }); // Wait for transaction confirmation const result = await aptos.waitForTransaction({ transactionHash: response.hash, }); return result; }; /** * Call a view function on the contract (read-only) */ const viewFunction = async ( functionName: string, args: (string | number | boolean | Uint8Array)[] ): Promise => { const result = await aptos.view({ payload: { function: `${MODULE_ADDRESS}::${MODULE_NAME}::${functionName}`, functionArguments: args, }, }); return result as T; }; /** * Get account balance */ const getBalance = async (address: string): Promise => { try { const resources = await aptos.getAccountResources({ accountAddress: address, }); const coinResource = resources.find( (r) => r.type === "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>" ); if (coinResource) { return parseInt((coinResource.data as { coin: { value: string } }).coin.value, 10); } return 0; } catch { return 0; } }; return { callFunction, viewFunction, getBalance, account, aptos, moduleAddress: MODULE_ADDRESS, moduleName: MODULE_NAME, }; }