```\nfunction _validateSigner(\n    uint256 timestamp,\n    address asset,\n    uint256 price,\n    bytes memory signature\n) internal view returns (bool) {\n    bytes32 digest = ECDSA.toEthSignedMessageHash(\n        keccak256(abi.encodePacked(timestamp, asset, price))\n    );\n    address recoveredSigner = ECDSA.recover(digest, signature);\n    return recoveredSigner == publisher;\n}\n```\n