|
1 | | -import { BaseError, ContractFunctionRevertedError } from "viem"; |
| 1 | +type ContractFunctionReverted = { |
| 2 | + data?: { args?: readonly unknown[]; errorName?: string }; |
| 3 | + name: "ContractFunctionRevertedError"; |
| 4 | + reason?: string; |
| 5 | + signature?: string; |
| 6 | +}; |
2 | 7 |
|
3 | 8 | type Fallback = "message" | "name" | "string" | "unknown"; |
4 | 9 |
|
5 | 10 | export default function revertReason( |
6 | 11 | error?: unknown, |
7 | 12 | { fallback = "name", withArguments = false }: { fallback?: Fallback; withArguments?: boolean } = {}, |
8 | 13 | ): string { |
9 | | - const cause = error instanceof BaseError ? error.walk((r) => r instanceof ContractFunctionRevertedError) : undefined; |
10 | | - return cause instanceof ContractFunctionRevertedError |
11 | | - ? withArguments && cause.data?.errorName |
12 | | - ? `${cause.data.errorName}(${cause.data.args?.map(String).join(",") ?? ""})` |
13 | | - : (cause.data?.errorName ?? cause.reason ?? cause.signature ?? "unknown") |
14 | | - : fallback === "message" |
15 | | - ? error instanceof Error |
16 | | - ? error.message |
17 | | - : String(error) |
18 | | - : fallback === "string" |
19 | | - ? String(error) |
20 | | - : fallback === "unknown" |
21 | | - ? "unknown" |
22 | | - : error instanceof Error |
23 | | - ? error.name |
24 | | - : "unknown"; |
| 14 | + const cause = findRevertedCause(error); |
| 15 | + if (cause) { |
| 16 | + if (withArguments && cause.data?.errorName) { |
| 17 | + return `${cause.data.errorName}(${cause.data.args?.map(String).join(",") ?? ""})`; |
| 18 | + } |
| 19 | + return cause.data?.errorName ?? cause.reason ?? cause.signature ?? "unknown"; |
| 20 | + } |
| 21 | + if (fallback === "message") return error instanceof Error ? error.message : String(error); |
| 22 | + if (fallback === "string") return String(error); |
| 23 | + if (fallback === "unknown") return "unknown"; |
| 24 | + return error instanceof Error ? error.name : "unknown"; |
| 25 | +} |
| 26 | + |
| 27 | +export function findRevertedCause(error: unknown): ContractFunctionReverted | undefined { |
| 28 | + for ( |
| 29 | + let cause: unknown = error; |
| 30 | + cause != null && typeof cause === "object"; |
| 31 | + cause = (cause as { cause?: unknown }).cause |
| 32 | + ) { |
| 33 | + if ("name" in cause && (cause as { name?: unknown }).name === "ContractFunctionRevertedError") { |
| 34 | + return cause as ContractFunctionReverted; |
| 35 | + } |
| 36 | + } |
| 37 | + return undefined; |
25 | 38 | } |
0 commit comments