写在前面:使用\x19\x01的签名方式进行调用
1.VerifyEIP712.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
import "../libraries/LibBytes.sol";
abstract contract VerifyEIP712 {
using LibBytes for bytes;
struct EIP712Domain {
string name;
string version;
uint256 chainId;
address verifyingContract;
}
struct VerifyClaim{
bytes32 payload;
uint64 nextNonce;
address sigAddr;
}
bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
bytes32 public constant VERIFYCLAIM_TYPEHASH = keccak256(
"VerifyClaim(bytes32 payload,uint64 nextNonce,address sigAddr)"
);
bytes32 public immutable DOMAIN_SEPARATOR = hash(EIP712Domain({
name: "Test",
version: "v1",
chainId: getChainID(),
verifyingContract: address(this)
}));
function getChainID() internal view returns (uint256) {
uint256 chainId;
assembly {
chainId := chainid()
}
return chainId;
}
function hash(EIP712Domain memory eip712Domain) internal pure returns (bytes32) {
return keccak256(abi.encode(
EIP712DOMAIN_TYPEHASH,
keccak256(bytes(eip712Domain.name)),
keccak256(bytes(eip712Domain.version)),
eip712Domain.chainId,
eip712Domain.verifyingContract
));
}
function hash(VerifyClaim memory verifyclaim) internal pure returns (bytes32) {
re