// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract TWASigUtils { bytes32 internal DOMAIN_SEPARATOR; constructor(bytes32 _DOMAIN_SEPARATOR) { DOMAIN_SEPARATOR = _DOMAIN_SEPARATOR; } // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x72a9ba9d768e35b4ab8761b0abf8d49a4318cec0209bdc7ba8ac6136bf16ec8f; struct Permit { address owner; address spender; uint256 value; uint256 nonce; uint256 deadline; } // computes the hash of a permit function getStructHash(Permit memory _permit) internal pure returns (bytes32) { return keccak256( abi.encode( PERMIT_TYPEHASH, _permit.owner, _permit.spender, _permit.value, _permit.nonce, _permit.deadline ) ); } // computes the hash of the fully encoded EIP-712 message for the domain, which can be used to recover the signer function getTypedDataHash(Permit memory _permit) public view returns (bytes32) { return keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, getStructHash(_permit) ) ); } }