Polygon链USDT无气交易(executeMetaTransaction)签名匹配错误排查
Domain Name 不匹配
你设置的domain name是(PoS) Tether USD,但Polygon主网USDT合约(0xc2132D05D31c914a87C6611C10748AEb04B58e8F)的实际名称是Tether USD。EIP712签名要求domain的name必须与合约中定义的完全一致,名称错误会导致哈希结果不匹配,进而验证失败。FunctionSignature 变量赋值错误
你生成的transfer函数编码结果存在recipientTransfer变量中,但签名消息里用的是functionSignature。如果没有将recipientTransfer赋值给functionSignature,会导致消息中的函数签名为空或错误,直接引发签名验证失败。MetaTransaction 结构体字段/类型不匹配
检查合约中MetaTransaction结构体的定义,必须与你签名时的types完全一致:字段顺序、类型(如uint256/address/bytes)不能有任何差异。EIP712是按结构体字段顺序生成哈希的,哪怕顺序错一个,都会导致签名哈希不匹配。V值处理错误
Ethers.js v6中,ethers.Signature.from(signature).v返回的是0或1,但多数合约在验证签名时期望v值为27或28。如果直接将获取到的v值传入合约,会导致ecrecover计算出的签名者地址错误,触发不匹配提示。需要将v值加27后再传入:const v = ethers.Signature.from(signature).v + 27;Nonce 不匹配
确认获取的nonce是合约中与executeMetaTransaction绑定的用户专属nonce,且调用getNonce时传入的地址是签名用户的地址。如果nonce过期(比如之前已用过该nonce执行过交易),或者获取的是错误的nonce(比如合约里有多个nonce变量),也会导致验证失败。
内容的提问来源于stack exchange,提问作者Mr. Engineer

