You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.9 KiB

import type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'
import { BaseError } from '../../errors/base.js'
import {
ExecutionRevertedError,
type ExecutionRevertedErrorType,
FeeCapTooHighError,
type FeeCapTooHighErrorType,
FeeCapTooLowError,
type FeeCapTooLowErrorType,
InsufficientFundsError,
type InsufficientFundsErrorType,
IntrinsicGasTooHighError,
type IntrinsicGasTooHighErrorType,
IntrinsicGasTooLowError,
type IntrinsicGasTooLowErrorType,
NonceMaxValueError,
type NonceMaxValueErrorType,
NonceTooHighError,
type NonceTooHighErrorType,
NonceTooLowError,
type NonceTooLowErrorType,
TipAboveFeeCapError,
type TipAboveFeeCapErrorType,
TransactionTypeNotSupportedError,
type TransactionTypeNotSupportedErrorType,
UnknownNodeError,
type UnknownNodeErrorType,
} from '../../errors/node.js'
import { RpcRequestError } from '../../errors/request.js'
import {
InvalidInputRpcError,
TransactionRejectedRpcError,
} from '../../errors/rpc.js'
import type { ExactPartial } from '../../types/utils.js'
export function containsNodeError(err: BaseError) {
return (
err instanceof TransactionRejectedRpcError ||
err instanceof InvalidInputRpcError ||
(err instanceof RpcRequestError && err.code === ExecutionRevertedError.code)
)
}
export type GetNodeErrorParameters = ExactPartial<
SendTransactionParameters<any>
>
export type GetNodeErrorReturnType =
| ExecutionRevertedErrorType
| FeeCapTooHighErrorType
| FeeCapTooLowErrorType
| NonceTooHighErrorType
| NonceTooLowErrorType
| NonceMaxValueErrorType
| InsufficientFundsErrorType
| IntrinsicGasTooHighErrorType
| IntrinsicGasTooLowErrorType
| TransactionTypeNotSupportedErrorType
| TipAboveFeeCapErrorType
| UnknownNodeErrorType
export function getNodeError(
err: BaseError,
args: GetNodeErrorParameters,
): GetNodeErrorReturnType {
const message = (err.details || '').toLowerCase()
const executionRevertedError =
err instanceof BaseError
? err.walk(
(e) =>
(e as { code: number } | null | undefined)?.code ===
ExecutionRevertedError.code,
)
: err
if (executionRevertedError instanceof BaseError)
return new ExecutionRevertedError({
cause: err,
message: executionRevertedError.details,
}) as any
if (ExecutionRevertedError.nodeMessage.test(message))
return new ExecutionRevertedError({
cause: err,
message: err.details,
}) as any
if (FeeCapTooHighError.nodeMessage.test(message))
return new FeeCapTooHighError({
cause: err,
maxFeePerGas: args?.maxFeePerGas,
}) as any
if (FeeCapTooLowError.nodeMessage.test(message))
return new FeeCapTooLowError({
cause: err,
maxFeePerGas: args?.maxFeePerGas,
}) as any
if (NonceTooHighError.nodeMessage.test(message))
return new NonceTooHighError({ cause: err, nonce: args?.nonce }) as any
if (NonceTooLowError.nodeMessage.test(message))
return new NonceTooLowError({ cause: err, nonce: args?.nonce }) as any
if (NonceMaxValueError.nodeMessage.test(message))
return new NonceMaxValueError({ cause: err, nonce: args?.nonce }) as any
if (InsufficientFundsError.nodeMessage.test(message))
return new InsufficientFundsError({ cause: err }) as any
if (IntrinsicGasTooHighError.nodeMessage.test(message))
return new IntrinsicGasTooHighError({ cause: err, gas: args?.gas }) as any
if (IntrinsicGasTooLowError.nodeMessage.test(message))
return new IntrinsicGasTooLowError({ cause: err, gas: args?.gas }) as any
if (TransactionTypeNotSupportedError.nodeMessage.test(message))
return new TransactionTypeNotSupportedError({ cause: err }) as any
if (TipAboveFeeCapError.nodeMessage.test(message))
return new TipAboveFeeCapError({
cause: err,
maxFeePerGas: args?.maxFeePerGas,
maxPriorityFeePerGas: args?.maxPriorityFeePerGas,
}) as any
return new UnknownNodeError({
cause: err,
}) as any
}