78 lines
2.4 KiB
TypeScript
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
|
|
}
|