Simulate contracts to get error messages before user tries it
const { data, error, status } = useSimulateContract({ abi: BookingFactoryABI, address: process.env.NEXT_PUBLIC_BOOKING_FACTORY_ADDRESS as any, functionName: 'createBooking', args: [1n, 'simulate'], })
Estimate gas price for transaction to check if user has enough balance
useEffect(() => { const a = async () => { if (publicClient) { const a = await estimateContractGas(publicClient, { abi: BookingFactoryABI, address: process.env.NEXT_PUBLIC_BOOKING_FACTORY_ADDRESS as any, functionName: 'createBooking', args: [1n, 'simulate'], }) console.log(a, 'gasss') } } a() }, [publicClient])
Watch contract events to to retrieve write transaction reults
useEffect(() => { if (publicClient) { publicClient.watchContractEvent({ abi: BookingFactoryABI, eventName: 'BookingCreated', onLogs: (logs) => { console.log(logs) }, }) } }, [publicClient])
Wait for transaction receipt after on success in writecontractasync to get events for that transaction
await writeContractAsync( { abi: BookingFactoryABI, address: process.env.NEXT_PUBLIC_BOOKING_FACTORY_ADDRESS as any, functionName: 'createBooking', args: [influencersRequired, bookingId], }, { onError: (error) => { setIsLoading(false) }, onSuccess: async (hash) => { if (publicClient) { const receipt = await waitForTransactionReceipt(publicClient, { hash, }) const bookingIdInBytes = keccak256(toBytes(bookingId)) const log = receipt.logs.find((log) => log.topics[1] === bookingIdInBytes) if (log) { await axios.post('/api/booking/set-blockchain-address', { booking_id: bookingId, blockchain_address: log.topics[0], }) // window.open('/dashboard/my-bookings', '_self') } } setIsLoading(false) }, }, )
Top comments (0)