@tevm/actions
Version:
A typesafe library for writing forge scripts in typescript
162 lines (137 loc) • 4.49 kB
JavaScript
import {
InvalidAddToBlockchainError,
InvalidAddToMempoolError,
InvalidBlobVersionedHashesError,
InvalidBlockError,
InvalidCallerError,
InvalidDepthError,
InvalidGasPriceError,
InvalidGasRefundError,
InvalidMaxFeePerGasError,
InvalidMaxPriorityFeePerGasError,
InvalidOriginError,
InvalidParamsError,
InvalidSelfdestructError,
InvalidSkipBalanceError,
InvalidToError,
InvalidValueError,
} from '@tevm/errors'
import { zBaseCallParams } from './zBaseCallParams.js'
// TODO we are missing some validation including stateOverrides
/**
* @typedef {InvalidParamsError| InvalidSkipBalanceError| InvalidGasRefundError| InvalidBlockError| InvalidGasPriceError| InvalidOriginError| InvalidCallerError| InvalidDepthError| InvalidBlobVersionedHashesError| InvalidAddToMempoolError| InvalidAddToBlockchainError} ValidateBaseCallParamsError
*/
/**
* @internal can break on a minor release
* Validates that the parameters are correct with zod
* @param {import('../BaseCall/BaseCallParams.js').BaseCallParams} action
*/
export const validateBaseCallParams = (action) => {
/**
* @type {Array<ValidateBaseCallParamsError>}
*/
const errors = []
const parsedParams = zBaseCallParams.safeParse(action)
if (parsedParams.success === false) {
const formattedErrors = parsedParams.error.format()
// Iterate over the general errors
formattedErrors._errors.forEach((error) => {
errors.push(new InvalidParamsError(error))
})
// Error handling for specific fields
if (formattedErrors.skipBalance) {
formattedErrors.skipBalance._errors.forEach((error) => {
errors.push(new InvalidSkipBalanceError(error))
})
}
if (formattedErrors.gasRefund) {
formattedErrors.gasRefund._errors.forEach((error) => {
errors.push(new InvalidGasRefundError(error))
})
}
if (formattedErrors.blockTag) {
formattedErrors.blockTag._errors.forEach((error) => {
errors.push(new InvalidBlockError(error))
})
}
if (formattedErrors.gas) {
formattedErrors.gas._errors.forEach((error) => {
errors.push(new InvalidGasPriceError(error))
})
}
if (formattedErrors.origin) {
formattedErrors.origin._errors.forEach((error) => {
errors.push(new InvalidOriginError(error))
})
}
if (formattedErrors.caller) {
formattedErrors.caller._errors.forEach((error) => {
errors.push(new InvalidCallerError(error))
})
}
if (formattedErrors.gas) {
formattedErrors.gas._errors.forEach((error) => {
errors.push(new InvalidGasPriceError(error))
})
}
if (formattedErrors.value) {
formattedErrors.value._errors.forEach((error) => {
errors.push(new InvalidValueError(error))
})
}
if (formattedErrors.depth) {
formattedErrors.depth._errors.forEach((error) => {
errors.push(new InvalidDepthError(error))
})
}
if (formattedErrors.selfdestruct) {
formattedErrors.selfdestruct._errors.forEach((error) => {
errors.push(new InvalidSelfdestructError(error))
})
}
if (formattedErrors.to) {
formattedErrors.to._errors.forEach((error) => {
errors.push(new InvalidToError(error))
})
}
if (formattedErrors.blobVersionedHashes) {
formattedErrors.blobVersionedHashes._errors.forEach((error) => {
errors.push(new InvalidBlobVersionedHashesError(error))
})
for (const [key, value] of Object.entries(formattedErrors.blobVersionedHashes)) {
if (key === '_errors') continue
if ('_errors' in value) {
value._errors.forEach((error) => {
errors.push(new InvalidBlobVersionedHashesError(error))
})
}
}
}
if (formattedErrors.maxFeePerGas) {
formattedErrors.maxFeePerGas._errors.forEach((error) => {
errors.push(new InvalidMaxFeePerGasError(error))
})
}
if (formattedErrors.maxPriorityFeePerGas) {
formattedErrors.maxPriorityFeePerGas._errors.forEach((error) => {
errors.push(new InvalidMaxPriorityFeePerGasError(error))
})
}
if (formattedErrors.addToMempool) {
formattedErrors.addToMempool._errors.forEach((error) => {
errors.push(new InvalidAddToMempoolError(error))
})
}
if (formattedErrors.addToBlockchain) {
formattedErrors.addToBlockchain._errors.forEach((error) => {
errors.push(new InvalidAddToBlockchainError(error))
})
}
// if we missed an error let's make sure we handle it here
// THis is purely defensive
if (errors.length === 0 && parsedParams.success === false) {
errors.push(new InvalidParamsError(parsedParams.error.message))
}
}
return errors
}