Skip to content

Commit 02b0d16

Browse files
Merge pull request #2050 from Web3Auth/feat/validateTypeData-viem
feat: validate typedData via viem lib
2 parents e4876f9 + 085d851 commit 02b0d16

File tree

7 files changed

+64
-39
lines changed

7 files changed

+64
-39
lines changed

package-lock.json

Lines changed: 46 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/providers/account-abstraction-provider/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"@web3auth/ethereum-provider": "^9.5.2",
2929
"ethers": "^6.13.4",
3030
"permissionless": "^0.2.23",
31-
"viem": "^2.21.55"
31+
"viem": "^2.22.5"
3232
},
3333
"peerDependencies": {
3434
"@babel/runtime": "7.x"

packages/providers/account-abstraction-provider/src/providers/utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export function getProviderHandlers({
4747
processTransaction: async (txParams: TransactionParams & { gas?: string }): Promise<string> => {
4848
if (txParams.input && !txParams.data) txParams.data = addHexPrefix(txParams.input);
4949
const { to, value, data } = txParams;
50+
// @ts-expect-error viem types are too deep
5051
const userOperationParams: SendUserOperationParameters = {
5152
account: smartAccount,
5253
calls: [
@@ -59,7 +60,7 @@ export function getProviderHandlers({
5960
],
6061
// should not use maxFeePerGas/maxPriorityFeePerGas from transaction params since that's fee for transaction not user operation and let bundler handle it instead
6162
};
62-
// @ts-expect-error viem types are too deep
63+
6364
const userOpHash = await bundlerClient.sendUserOperation(userOperationParams);
6465

6566
const txReceipt = await bundlerClient.waitForUserOperationReceipt({ hash: userOpHash });

packages/providers/ethereum-mpc-provider/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"@web3auth/base": "^9.5.2",
2727
"@web3auth/base-provider": "^9.5.2",
2828
"@web3auth/ethereum-provider": "^9.5.2",
29-
"ethers": "^6.13.4"
29+
"ethers": "^6.13.4",
30+
"viem": "^2.22.5"
3031
},
3132
"peerDependencies": {
3233
"@babel/runtime": "7.x"

packages/providers/ethereum-mpc-provider/src/providers/signingProviders/signingUtils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import { log } from "@web3auth/base";
55
import {
66
IProviderHandlers,
77
MessageParams,
8-
SignTypedDataMessageV4,
98
SignTypedDataVersion,
109
TransactionFormatter,
1110
TransactionParams,
1211
TypedMessageParams,
1312
validateTypedSignMessageDataV4,
1413
} from "@web3auth/ethereum-provider";
15-
import { hashMessage, Signature, TypedDataEncoder } from "ethers";
14+
import { hashMessage, Signature } from "ethers";
15+
import { hashTypedData, hexToBytes, validateTypedData } from "viem";
1616

1717
async function signTx(
1818
txParams: TransactionParams & { gas?: string },
@@ -89,9 +89,10 @@ async function signTypedData(
8989
if (data === null || data === undefined) {
9090
throw new Error("Missing data parameter");
9191
}
92-
const message: SignTypedDataMessageV4 = typeof data === "string" ? JSON.parse(data) : data;
92+
const message = typeof data === "string" ? JSON.parse(data) : data;
93+
validateTypedData(message);
9394

94-
const { v, r, s } = await sign(Buffer.from(TypedDataEncoder.hash(message.domain, message.types, message.message).slice(2), "hex"));
95+
const { v, r, s } = await sign(Buffer.from(hexToBytes(hashTypedData(message))));
9596

9697
let modifiedV = v;
9798
if (modifiedV <= 1) {
@@ -170,7 +171,6 @@ export function getProviderHandlers({
170171
const chainId = await providerEngineProxy.request<unknown, string>({ method: "eth_chainId" });
171172
await validateTypedSignMessageDataV4(msgParams, chainId);
172173
const data = typeof msgParams.data === "string" ? JSON.parse(msgParams.data) : msgParams.data;
173-
if (data.types.EIP712Domain) delete data.types.EIP712Domain;
174174
const sig = signTypedData(sign, data, SignTypedDataVersion.V4);
175175
return sig;
176176
},

packages/providers/ethereum-provider/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
"bignumber.js": "^9.1.2",
3232
"bn.js": "^5.2.1",
3333
"ethers": "^6.13.4",
34-
"jsonschema": "^1.4.1"
34+
"jsonschema": "^1.4.1",
35+
"viem": "^2.22.5"
3536
},
3637
"devDependencies": {
3738
"@types/bn.js": "^5.1.6",

packages/providers/ethereum-provider/src/providers/privateKeyProviders/ethPrivatekeyUtils.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import { signMessage } from "@toruslabs/base-controllers";
33
import { getPublicCompressed } from "@toruslabs/eccrypto";
44
import { JRPCRequest, providerErrors } from "@web3auth/auth";
55
import { log, SafeEventEmitterProvider } from "@web3auth/base";
6-
import { hashMessage, SigningKey, TypedDataEncoder } from "ethers";
6+
import { hashMessage, SigningKey } from "ethers";
7+
import { hashTypedData, validateTypedData } from "viem";
78

8-
import { IProviderHandlers, MessageParams, SignTypedDataMessageV4, TransactionParams, TypedMessageParams } from "../../rpc/interfaces";
9+
import { IProviderHandlers, MessageParams, TransactionParams, TypedMessageParams } from "../../rpc/interfaces";
910
import { TransactionFormatter } from "./TransactionFormatter/formatter";
1011
import { validateTypedSignMessageDataV4 } from "./TransactionFormatter/utils";
1112

@@ -103,10 +104,10 @@ export function getProviderHandlers({
103104
});
104105
const chainId = await providerEngineProxy.request<never, string>({ method: "eth_chainId" });
105106
await validateTypedSignMessageDataV4(msgParams, chainId);
106-
const data: SignTypedDataMessageV4 = typeof msgParams.data === "string" ? JSON.parse(msgParams.data) : msgParams.data;
107+
const data = typeof msgParams.data === "string" ? JSON.parse(msgParams.data) : msgParams.data;
107108
const ethersPrivateKey = new SigningKey(privKeyBuffer);
108-
if (data.types.EIP712Domain) delete data.types.EIP712Domain;
109-
const signature = ethersPrivateKey.sign(TypedDataEncoder.hash(data.domain, data.types, data.message)).serialized;
109+
validateTypedData(data);
110+
const signature = ethersPrivateKey.sign(hashTypedData(data)).serialized;
110111
return signature;
111112
},
112113
};

0 commit comments

Comments
 (0)