Slow-Claim Malus Escrow

slow-claim-malus-escrow · conditional-settlement · 1169 B runtime · funds-movement

scores

source

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract SlowClaimMalusEscrow {
    address payable private immutable provider;
    address payable private immutable payer;
    uint256 private immutable graceEnd;
    uint256 private immutable deadline;
    uint256 private immutable deposit;
    bool private claimed;

    event Claimed(address indexed provider, uint256 amount);
    event Withdrawn(address indexed payer, uint256 amount);

    constructor(address _provider, uint256 _graceEnd, uint256 _deadline) payable {
        require(_provider != address(0));
        require(_graceEnd > block.timestamp);
        require(_deadline > _graceEnd);
        require(msg.value > 0);
        provider = payable(_provider);
        payer = payable(msg.sender);
        graceEnd = _graceEnd;
        deadline = _deadline;
        deposit = msg.value;
    }

    function claim() external {
        require(msg.sender == provider);
        require(!claimed);
        require(block.timestamp >= graceEnd);
        uint256 amount;
        if (block.timestamp >= deadline) {
            amount = 0;
        } else {
            amount = deposit * (deadline - block.timestamp) / (deadline - graceEnd);
        }
        claimed = true;
        if (amount > 0) {
            (bool ok, ) = provider.call{value: amount}("");
            require(ok);
        }
        emit Claimed(provider, amount);
    }

    function withdrawAfterDeadline() external {
        require(msg.sender == payer);
        require(block.timestamp > deadline);
        uint256 amount = address(this).balance;
        require(amount != 0);
        (bool ok, ) = payer.call{value: amount}("");
        require(ok);
        emit Withdrawn(payer, amount);
    }
}

published

published on testnet · 0xb2097a0Ab2812670a404121BD954f693a67daAb1 · tx 0x216d8400fbf2829f… · base (84532) · testnet · source as deployed