pragma solidity ^0.8.13; contract HashChainReceiptAnchor { address public immutable agent; bytes32 public head; event Append(uint256 indexed blockNumber, bytes32 indexed newHead, address indexed agent); modifier onlyAgent() { require(msg.sender == agent, "not agent"); _; } constructor(address _agent) { require(_agent != address(0), "zero"); agent = _agent; } function append(bytes calldata attestationData) external onlyAgent returns (bytes32 newHead) { newHead = keccak256(abi.encodePacked(head, attestationData)); head = newHead; emit Append(block.number, newHead, msg.sender); } }