// 签名验证核心逻辑
function _verifySignature(
address user,
bytes memory signature,
uint8 operation,
uint256 expireTime
) internal virtual returns (bool) {
if (block.timestamp > expireTime) revert SignatureExpired();
bytes32 messageHash = keccak256(
abi.encodePacked(block.chainid, address(this), user, txNonce[user], operation, expireTime)
);
bytes32 ethSignedHash = MessageHashUtils.toEthSignedMessageHash(messageHash);
address recovered = ECDSA.recover(ethSignedHash, signature);
if (recovered != owner() && subAdmins[recovered].permissionLevel != PERMISSION_SIGNATURE_MANAGER) return false;
txNonce[user]++;
return true;
}