eth_signTypedData_v4
按 EIP-712 v4 规则签名结构化数据。相比原始哈希或普通文本签名,它能让用户看到更有语义的字段,也更适合链上验证授权、订单或 Permit 等数据。
入参
| 索引 | 类别 | 说明 |
|---|---|---|
| 0 | string | 发起签名的账户地址 |
| 1 | string | 类别化数据 JSON 字符串 |
结果
string - 65 字节签名,十六进制字符串格式。
类型化数据结构
interface TypedData {
types: {
EIP712Domain: Array<{ name: string; type: string }>;
[typeName: string]: Array<{ name: string; type: string }>;
};
primaryType: string;
domain: {
name?: string;
version?: string;
chainId?: number;
verifyingContract?: string;
salt?: string;
};
message: Record<string, any>;
}
示范
const typedData = {
types: {
EIP712Domain: [
{ name: "name", type: "string" },
{ name: "version", type: "string" },
{ name: "chainId", type: "uint256" },
{ name: "verifyingContract", type: "address" },
],
Person: [
{ name: "name", type: "string" },
{ name: "wallet", type: "address" },
],
Mail: [
{ name: "from", type: "Person" },
{ name: "to", type: "Person" },
{ name: "contents", type: "string" },
],
},
primaryType: "Mail",
domain: {
name: "UKey Wallet 示例钱包",
version: "1",
chainId: 1,
verifyingContract: "0x2b4d6f8091a3c5e7f9b1d3f507192b4d6f8091a3",
},
message: {
from: {
name: "Ava",
wallet: "0x4b6d8f0123456789abcdef0123456789abcdef01",
},
to: {
name: "Liam",
wallet: "0xc4d2e1f0a9876543210fedcba9876543210abcde",
},
contents: "Payment approval sample",
},
};
const signature = await window.$ukey.ethereum.request({
method: "eth_signTypedData_v4",
requestParams: [accounts[0], JSON.stringify(typedData)],
});
console.log("生成的签名:", signature);
Permit 签名(ERC-2612)
const permitData = {
types: {
EIP712Domain: [
{ name: "name", type: "string" },
{ name: "version", type: "string" },
{ name: "chainId", type: "uint256" },
{ name: "verifyingContract", type: "address" },
],
Permit: [
{ name: "owner", type: "address" },
{ name: "spender", type: "address" },
{ name: "value", type: "uint256" },
{ name: "nonce", type: "uint256" },
{ name: "deadline", type: "uint256" },
],
},
primaryType: "Permit",
domain: {
name: "USDC.e",
version: "2",
chainId: 1,
verifyingContract: "0x2b4d6f8091a3c5e7f9b1d3f507192b4d6f8091a3",
},
message: {
owner: accounts[0],
spender: "0x4b6d8f0123456789abcdef0123456789abcdef01",
value: "2500000000", // 2500 枚 USDC
nonce: 0,
deadline: Math.floor(Date.now() / 1000) + 3600,
},
};
const signature = await window.$ukey.ethereum.request({
method: "eth_signTypedData_v4",
requestParams: [accounts[0], JSON.stringify(permitData)],
});
错误码
| 错误码 | 消息 | 说明 |
|---|---|---|
| 4001 | 用户取消了本次请求 | 用户取消了签名确认 |
| -32602 | Invalid params | 类别化数据结构无效 |
说明
- 类型化数据必须能被解析为合法 JSON。
domain.chainId应与当前eth_chainId一致。domain.verifyingContract应指向实际负责验签的合约。- 用户会在钱包中看到结构化字段,请使用清晰的字段名和可理解的业务内容。
- 遵循 EIP-712 规范。