From 23f581bfb09591898ab428750f05a38f5348c3a3 Mon Sep 17 00:00:00 2001 From: Simon Fremaux Date: Fri, 5 Jul 2024 17:50:30 +0200 Subject: [PATCH] support UnknownRpcError in getSenderAddress --- .../actions/public/getSenderAddress.ts | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/permissionless/actions/public/getSenderAddress.ts b/packages/permissionless/actions/public/getSenderAddress.ts index 9479e5a3..3273d8d4 100644 --- a/packages/permissionless/actions/public/getSenderAddress.ts +++ b/packages/permissionless/actions/public/getSenderAddress.ts @@ -10,7 +10,8 @@ import { RpcRequestError, type Transport, concat, - decodeErrorResult + decodeErrorResult, + UnknownRpcError } from "viem" import { simulateContract } from "viem/actions" @@ -136,7 +137,8 @@ export const getSenderAddress = async < (err) => err instanceof ContractFunctionRevertedError || err instanceof RpcRequestError || - err instanceof InvalidInputRpcError + err instanceof InvalidInputRpcError || + err instanceof UnknownRpcError ) if (revertError instanceof ContractFunctionRevertedError) { @@ -220,6 +222,44 @@ export const getSenderAddress = async < return error.args[0] as Address } + if (revertError instanceof UnknownRpcError) { + const parsedBody: any = JSON.parse( + (revertError as unknown as any).cause.body + ) + const revertData = parsedBody.error.data + + const hexStringRegex = /0x[a-fA-F0-9]+/ + // biome-ignore lint/suspicious/noExplicitAny: + const match = revertData.match(hexStringRegex) + + if (!match) { + throw new Error( + "Failed to parse revert bytes from RPC response" + ) + } + + const data: Hex = match[0] + + const error = decodeErrorResult({ + abi: [ + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address" + } + ], + name: "SenderAddressResult", + type: "error" + } + ], + data + }) + + return error.args[0] as Address + } + throw e }