From 5a1a88ae54a395feb9e3bca2288e9bfed22d927d Mon Sep 17 00:00:00 2001 From: kuzey <61727501+0xkuzeydurden@users.noreply.github.com> Date: Sat, 24 Jan 2026 17:49:22 +0300 Subject: [PATCH] refactor: implement structured error codes for signer rejections This PR introduces structured error handling in BaseAccountProvider to address unclear feedback during signer failures. By intercepting EIP-1193 code 4001, the SDK now returns a programmatically accessible user_rejected code, enabling better UI/UX handling for developers. Closes #213 --- .../interface/builder/core/BaseAccountProvider.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/account-sdk/src/interface/builder/core/BaseAccountProvider.ts b/packages/account-sdk/src/interface/builder/core/BaseAccountProvider.ts index 369cdab43..06b6a0ef9 100644 --- a/packages/account-sdk/src/interface/builder/core/BaseAccountProvider.ts +++ b/packages/account-sdk/src/interface/builder/core/BaseAccountProvider.ts @@ -140,11 +140,24 @@ export class BaseAccountProvider extends ProviderEventEmitter implements Provide } const result = await this.signer.request(args); return result as T; - } catch (error) { + } catch (error: any) { const { code } = error as { code?: number }; + + // 1. Authorization check (Maintain existing logic) if (code === standardErrorCodes.provider.unauthorized) { await this.disconnect(); } + + // 2. User Rejection handling (Fix for the issue) + // According to EIP-1193, code 4001 represents a user rejection. + if (code === 4001 || error.message?.toLowerCase().includes('user rejected')) { + const enrichedError = error instanceof Error ? error : new Error(error.message || 'User rejected the request'); + (enrichedError as any).code = 'user_rejected'; + (enrichedError as any).rawError = error; + return Promise.reject(serializeError(enrichedError)); + } + + // 3. Fallback to standard error serialization return Promise.reject(serializeError(error)); } }