pragma solidity ^0.8.13; contract CooldownCapabilityManifest { error ZeroHash(); error Cooldown(); mapping(address => uint256) private _records; event ManifestUpdated(address indexed agent, uint224 manifestHash, uint32 updatedAt, uint256 blockNumber); function set(uint224 manifestHash) external { if (manifestHash == 0) revert ZeroHash(); uint256 record = _records[msg.sender]; if (record != 0 && block.timestamp < uint256(uint32(record)) + 3600) revert Cooldown(); uint32 now32 = uint32(block.timestamp); _records[msg.sender] = (uint256(manifestHash) << 32) | now32; emit ManifestUpdated(msg.sender, manifestHash, now32, block.number); } function resolve(address agent) external view returns (uint224 manifestHash, uint32 lastUpdate, uint256 blockNumber) { uint256 record = _records[agent]; manifestHash = uint224(record >> 32); lastUpdate = uint32(record); blockNumber = block.number; } }