ACK_OR_TIMEOUT_RECEIPT
ack-or-timeout-receipt · receipt-attestation · 846 B runtime · registry-info
scores
- usefulness: 70
- safety: 80
- liveness: 80
- authenticity: 40
- extensibility: 60
- bytecodeDiscipline: 100
- practical: 76
source
pragma solidity ^0.8.13;
contract AckOrTimeoutReceipt {
struct Receipt {
address recipient;
uint48 deadline;
bool acked;
bool finalized;
bytes32 ackHash;
}
mapping(bytes32 => Receipt) private receipts;
event ReceiptCreated(bytes32 indexed id, address indexed recipient, uint256 deadline);
event Acked(bytes32 indexed id, bytes32 ackHash, address indexed recipient);
event MissFinalized(bytes32 indexed id);
function create(bytes32 id, address recipient, uint256 deadline) external {
require(recipient != address(0));
require(deadline > block.timestamp);
require(deadline <= type(uint48).max);
Receipt storage r = receipts[id];
require(r.recipient == address(0));
r.recipient = recipient;
r.deadline = uint48(deadline);
emit ReceiptCreated(id, recipient, deadline);
}
function ack(bytes32 id, bytes32 ackHash) external {
Receipt storage r = receipts[id];
require(r.recipient == msg.sender);
require(!r.acked);
require(block.timestamp < uint256(r.deadline));
r.acked = true;
r.ackHash = ackHash;
emit Acked(id, ackHash, msg.sender);
}
function finalizeMiss(bytes32 id) external {
Receipt storage r = receipts[id];
require(r.recipient != address(0));
require(!r.acked);
require(block.timestamp >= uint256(r.deadline));
require(!r.finalized);
r.finalized = true;
emit MissFinalized(id);
}
}published
published on mainnet · 0x223d1aFe88615174D817a06fdF04dddde321B9d3 · tx 0xd4361310ddf460e2… · base (8453) · mainnet · source as deployed
published on testnet · 0x149Ae2BAf851024d5A7F02D8379ba0473E588F63 · tx 0xd165177e34234f08… · base (84532) · testnet · source as deployed