import { Log } from 'viem' import { useCallback, useContext, useState } from 'react' import { CreateVestingConfig, StartVestConfig, ReleaseVestedFundsConfig, } from '@0xsplits/splits-sdk' import { SplitsContext } from '../context' import { ContractExecutionStatus, RequestError } from '../types' import { getSplitsClient } from '../utils' export const useCreateVestingModule = (): { createVestingModule: (arg0: CreateVestingConfig) => Promise status?: ContractExecutionStatus txHash?: string error?: RequestError } => { const context = useContext(SplitsContext) const splitsClient = getSplitsClient(context).vesting const [status, setStatus] = useState() const [txHash, setTxHash] = useState() const [error, setError] = useState() const createVestingModule = useCallback( async (argsDict: CreateVestingConfig) => { if (!splitsClient) throw new Error('Invalid chain id for vesting') try { setStatus('pendingApproval') setError(undefined) setTxHash(undefined) const { txHash: hash } = await splitsClient._submitCreateVestingModuleTransaction(argsDict) setStatus('txInProgress') setTxHash(hash) const events = await splitsClient.getTransactionEvents({ txHash: hash, eventTopics: splitsClient.eventTopics.createVestingModule, }) setStatus('complete') return events } catch (e) { setStatus('error') setError(e) } }, [splitsClient], ) return { createVestingModule, status, txHash, error } } export const useStartVest = (): { startVest: (arg0: StartVestConfig) => Promise status?: ContractExecutionStatus txHash?: string error?: RequestError } => { const context = useContext(SplitsContext) const splitsClient = getSplitsClient(context).vesting const [status, setStatus] = useState() const [txHash, setTxHash] = useState() const [error, setError] = useState() const startVest = useCallback( async (argsDict: StartVestConfig) => { if (!splitsClient) throw new Error('Invalid chain id for vesting') try { setStatus('pendingApproval') setError(undefined) setTxHash(undefined) const { txHash: hash } = await splitsClient._submitStartVestTransaction(argsDict) setStatus('txInProgress') setTxHash(hash) const events = await splitsClient.getTransactionEvents({ txHash: hash, eventTopics: splitsClient.eventTopics.startVest, }) setStatus('complete') return events } catch (e) { setStatus('error') setError(e) } }, [splitsClient], ) return { startVest, status, txHash, error } } export const useReleaseVestedFunds = (): { releaseVestedFunds: ( arg0: ReleaseVestedFundsConfig, ) => Promise status?: ContractExecutionStatus txHash?: string error?: RequestError } => { const context = useContext(SplitsContext) const splitsClient = getSplitsClient(context).vesting const [status, setStatus] = useState() const [txHash, setTxHash] = useState() const [error, setError] = useState() const releaseVestedFunds = useCallback( async (argsDict: ReleaseVestedFundsConfig) => { if (!splitsClient) throw new Error('Invalid chain id for vesting') try { setStatus('pendingApproval') setError(undefined) setTxHash(undefined) const { txHash: hash } = await splitsClient._submitReleaseVestedFundsTransaction(argsDict) setStatus('txInProgress') setTxHash(hash) const events = await splitsClient.getTransactionEvents({ txHash: hash, eventTopics: splitsClient.eventTopics.releaseVestedFunds, }) setStatus('complete') return events } catch (e) { setStatus('error') setError(e) } }, [splitsClient], ) return { releaseVestedFunds, status, txHash, error } }