pragma solidity ^0.8.13; contract HashChainReceipt { mapping(address => bytes32) public receipts; function attest(bytes32 dataHash) external returns (bytes32 newHash) { newHash = keccak256(abi.encodePacked(receipts[msg.sender], dataHash)); receipts[msg.sender] = newHash; } }