From 8c6378cd7772e963f86f41dfb4649e6719978535 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 12 Sep 2025 23:23:23 +1200 Subject: [PATCH] Fix signAuthorization for 1193 providers --- .changeset/shaggy-fans-live.md | 5 +++ .../thirdweb/src/wallets/injected/index.ts | 31 +++++++++++++++---- 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 .changeset/shaggy-fans-live.md diff --git a/.changeset/shaggy-fans-live.md b/.changeset/shaggy-fans-live.md new file mode 100644 index 00000000000..c2730a203d9 --- /dev/null +++ b/.changeset/shaggy-fans-live.md @@ -0,0 +1,5 @@ +--- +"thirdweb": patch +--- + +Fix signAuthorization implementation for 1193 provider diff --git a/packages/thirdweb/src/wallets/injected/index.ts b/packages/thirdweb/src/wallets/injected/index.ts index 56a7231fa6f..9fdce219a50 100644 --- a/packages/thirdweb/src/wallets/injected/index.ts +++ b/packages/thirdweb/src/wallets/injected/index.ts @@ -1,6 +1,7 @@ import * as ox__Authorization from "ox/Authorization"; -import type { EIP1193Provider } from "viem"; +import * as ox__Signature from "ox/Signature"; import { + type EIP1193Provider, getTypesForEIP712Domain, type SignTypedDataParameters, serializeTypedData, @@ -188,7 +189,7 @@ function createAccount({ async sendTransaction(tx: SendTransactionOption) { const gasFees = tx.gasPrice ? { - gasPrice: tx.gasPrice ? numberToHex(tx.gasPrice) : undefined, + gasPrice: numberToHex(tx.gasPrice), } : { maxFeePerGas: tx.maxFeePerGas @@ -201,6 +202,9 @@ function createAccount({ const params = [ { ...tx, + authorizationList: tx.authorizationList + ? ox__Authorization.toRpcList(tx.authorizationList) + : undefined, ...gasFees, from: this.address, gas: tx.gas ? numberToHex(tx.gas) : undefined, @@ -269,10 +273,25 @@ function createAccount({ }, async signAuthorization(authorization: AuthorizationRequest) { const payload = ox__Authorization.getSignPayload(authorization); - return await provider.request({ - method: "eth_sign", - params: [getAddress(account.address), payload], - }); + let signature: Hex | undefined; + try { + signature = await provider.request({ + method: "eth_sign", + params: [getAddress(account.address), payload], + }); + } catch { + // fallback to secp256k1_sign, some providers don't support eth_sign + signature = await provider.request({ + // @ts-expect-error - overriding types here + method: "secp256k1_sign", + params: [payload], + }); + } + if (!signature) { + throw new Error("Failed to sign authorization"); + } + const parsedSignature = ox__Signature.fromHex(signature as Hex); + return { ...authorization, ...parsedSignature }; }, async signTypedData(typedData) { if (!provider || !account.address) {