跳到主要内容

eth_signTypedData_v4

按 EIP-712 v4 规则签名结构化数据。相比原始哈希或普通文本签名,它能让用户看到更有语义的字段,也更适合链上验证授权、订单或 Permit 等数据。


入参

索引类别说明
0string发起签名的账户地址
1string类别化数据 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用户取消了本次请求用户取消了签名确认
-32602Invalid params类别化数据结构无效

说明

  • 类型化数据必须能被解析为合法 JSON。
  • domain.chainId 应与当前 eth_chainId 一致。
  • domain.verifyingContract 应指向实际负责验签的合约。
  • 用户会在钱包中看到结构化字段,请使用清晰的字段名和可理解的业务内容。
  • 遵循 EIP-712 规范。