hts/apps/migrant/lib/functions/deploy-contract/verify-contract.ts

78 lines
2.4 KiB
TypeScript

import { createPublicClient, http } from 'viem'
import { API_KEYS, API_URLS } from '@/lib/viem-utils'
import { VerifyContractParams } from '@/lib/functions/types'
import { DEFAULT_GLOBAL_CONFIG } from '@/lib/constants'
export const verifyContract = async ({
deployHash,
standardJsonInput,
encodedConstructorArgs,
fileName,
contractName,
viemChain
}: VerifyContractParams) => {
const publicClient = createPublicClient({
chain: viemChain,
transport: http()
})
if (!(await publicClient.getChainId())) {
throw new Error(`Provider for chain ${viemChain.name} not available`)
}
const deployReceipt = await publicClient
.getTransactionReceipt({ hash: deployHash })
.catch(error => {
throw new Error(`Error getting transaction receipt: ${error.message}`)
})
const contractAddress = deployReceipt.contractAddress
if (!contractAddress) {
throw new Error(
`Contract address not found in transaction receipt for ${deployHash}`
)
}
const apiUrl = API_URLS[viemChain.id]
const apiKey = API_KEYS[viemChain.id]
if (!apiKey) {
throw new Error(
`Unsupported chain or explorer API_KEY. Network: ${viemChain.name} ChainId: ${viemChain.id}`
)
}
try {
const params = new URLSearchParams()
params.append('apikey', apiKey)
params.append('module', 'contract')
params.append('action', 'verifysourcecode')
params.append('contractaddress', contractAddress)
params.append('sourceCode', standardJsonInput)
params.append('codeformat', 'solidity-standard-json-input')
params.append('contractname', fileName + ':' + contractName)
params.append('compilerversion', DEFAULT_GLOBAL_CONFIG.compilerVersion)
params.append('evmversion', 'paris')
params.append('optimizationUsed', '1')
if (encodedConstructorArgs) {
params.append('constructorArguements', encodedConstructorArgs)
}
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
},
body: new URLSearchParams(params).toString()
})
if (!response.ok) {
throw new Error(
`Explorer API request failed with status ${response.status}`
)
}
} catch (error) {
console.log('Verify response failed: ', error)
throw new Error(`Error verifying contract: ${(error as Error).message}`)
}
return contractAddress
}