UNPKG

@0xsplits/splits-sdk-react

Version:

React wrapper for the 0xSplits SDK

159 lines (127 loc) 4.4 kB
import { Log } from 'viem' import { useCallback, useContext, useState } from 'react' import { CreateLiquidSplitConfig, DistributeLiquidSplitTokenConfig, TransferLiquidSplitOwnershipConfig, } from '@0xsplits/splits-sdk' import { SplitsContext } from '../context' import { ContractExecutionStatus, RequestError } from '../types' import { getSplitsClient } from '../utils' export const useCreateLiquidSplit = (): { createLiquidSplit: ( arg0: CreateLiquidSplitConfig, ) => Promise<Log[] | undefined> status?: ContractExecutionStatus txHash?: string error?: RequestError } => { const context = useContext(SplitsContext) const splitsClient = getSplitsClient(context).liquidSplits const [status, setStatus] = useState<ContractExecutionStatus>() const [txHash, setTxHash] = useState<string>() const [error, setError] = useState<RequestError>() const createLiquidSplit = useCallback( async (argsDict: CreateLiquidSplitConfig) => { if (!splitsClient) throw new Error('Invalid chain id for liquid splits') try { setStatus('pendingApproval') setError(undefined) setTxHash(undefined) const { txHash: hash } = await splitsClient._submitCreateLiquidSplitTransaction(argsDict) setStatus('txInProgress') setTxHash(hash) const events = await splitsClient.getTransactionEvents({ txHash: hash, eventTopics: splitsClient.eventTopics.createLiquidSplit, }) setStatus('complete') return events } catch (e) { setStatus('error') setError(e) } }, [splitsClient], ) return { createLiquidSplit, status, txHash, error } } export const useDistributeLiquidSplitToken = (): { distributeToken: ( arg0: DistributeLiquidSplitTokenConfig, ) => Promise<Log[] | undefined> status?: ContractExecutionStatus txHash?: string error?: RequestError } => { const context = useContext(SplitsContext) const splitsClient = getSplitsClient(context).liquidSplits const [status, setStatus] = useState<ContractExecutionStatus>() const [txHash, setTxHash] = useState<string>() const [error, setError] = useState<RequestError>() const distributeToken = useCallback( async (argsDict: DistributeLiquidSplitTokenConfig) => { if (!splitsClient) throw new Error('Invalid chain id for liquid splits') try { setStatus('pendingApproval') setError(undefined) setTxHash(undefined) const { txHash: hash } = await splitsClient._submitDistributeTokenTransaction(argsDict) setStatus('txInProgress') setTxHash(hash) const events = await splitsClient.getTransactionEvents({ txHash: hash, eventTopics: splitsClient.eventTopics.distributeToken, }) setStatus('complete') return events } catch (e) { setStatus('error') setError(e) } }, [splitsClient], ) return { distributeToken, status, txHash, error } } export const useTransferLiquidSplitOwnership = (): { transferOwnership: ( arg0: TransferLiquidSplitOwnershipConfig, ) => Promise<Log[] | undefined> status?: ContractExecutionStatus txHash?: string error?: RequestError } => { const context = useContext(SplitsContext) const splitsClient = getSplitsClient(context).liquidSplits const [status, setStatus] = useState<ContractExecutionStatus>() const [txHash, setTxHash] = useState<string>() const [error, setError] = useState<RequestError>() const transferOwnership = useCallback( async (argsDict: TransferLiquidSplitOwnershipConfig) => { if (!splitsClient) throw new Error('Invalid chain id for liquid splits') try { setStatus('pendingApproval') setError(undefined) setTxHash(undefined) const { txHash: hash } = await splitsClient._submitTransferOwnershipTransaction(argsDict) setStatus('txInProgress') setTxHash(hash) const events = await splitsClient.getTransactionEvents({ txHash: hash, eventTopics: splitsClient.eventTopics.transferOwnership, }) setStatus('complete') return events } catch (e) { setStatus('error') setError(e) } }, [splitsClient], ) return { transferOwnership, status, txHash, error } }