// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; contract CommitRevealReceipt { mapping(address => bytes32) public commitments; event Revealed(address indexed committer, bytes32 receiptHash); function commit(bytes32 receiptHash, bytes32 secret) external { commitments[msg.sender] = keccak256(abi.encodePacked(uint256(uint160(address(this))), secret, receiptHash)); } function reveal(bytes32 receiptHash, bytes32 secret) external { bytes32 commitment = commitments[msg.sender]; require(commitment != bytes32(0)); require(keccak256(abi.encodePacked(uint256(uint160(address(this))), secret, receiptHash)) == commitment); delete commitments[msg.sender]; emit Revealed(msg.sender, receiptHash); } }