hts/apps/blogai/lib/hooks/use-w3gpt-deploy.tsx

101 lines
2.7 KiB
TypeScript

import { usePublicClient } from 'wagmi'
import { useGlobalStore } from '@/app/state/global-store'
import {
DeployContractParams,
DeployContractResult
} from '@/lib/functions/types'
import toast from 'react-hot-toast'
export function useW3GPTDeploy({ chainId }: { chainId: number }) {
const { setIsDeploying, setLastDeploymentData, setVerifyContractConfig } =
useGlobalStore()
const publicClient = usePublicClient({
chainId
})
async function deploy(_deployContractConfig?: DeployContractParams) {
setIsDeploying(true)
const deployContractResponse = await toast.promise(
fetch('/api/deploy-contract', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(_deployContractConfig)
}),
{
loading: 'Sending deploy transaction...',
success: 'Deploy transaction submitted!',
error: 'Failed to send deploy transaction'
}
)
setIsDeploying(false)
if (deployContractResponse.ok) {
const {
explorerUrl: txHashExplorerUrl,
ipfsUrl,
verifyContractConfig,
abi,
sourceCode,
standardJsonInput
}: DeployContractResult = await deployContractResponse.json()
setVerifyContractConfig(verifyContractConfig)
try {
const transactionReceipt = await toast.promise(
publicClient.waitForTransactionReceipt({
hash: verifyContractConfig?.deployHash
}),
{
loading: 'Waiting for confirmations...',
success: 'Transaction confirmed!',
error: 'Failed to receive enough confirmations'
}
)
const address = transactionReceipt?.contractAddress || undefined
const explorerUrl =
txHashExplorerUrl.split('/tx')[0] + `/address/${address}`
const deploymentData = {
explorerUrl,
ipfsUrl,
verificationStatus: 'pending',
address: address,
sourceCode,
abi,
transactionHash: verifyContractConfig?.deployHash,
standardJsonInput
}
setLastDeploymentData(deploymentData)
return deploymentData
} catch (e) {
const deploymentData = {
explorerUrl: txHashExplorerUrl,
ipfsUrl,
verificationStatus: 'pending',
sourceCode,
abi,
transactionHash: verifyContractConfig?.deployHash,
standardJsonInput
}
setLastDeploymentData(deploymentData)
return deploymentData
}
} else {
return {
error:
'Failed to deploy contract: ' +
(await deployContractResponse.json()).error
}
}
}
return { deploy }
}