Smart Eviction Compliance Contract

What it does:
Enforces eviction procedures on-chain by ensuring landlords follow legally required notice periods, grace windows, and compliance steps before a tenant can be evicted.

Why it matters:
Prevents unlawful or rushed evictions, protects tenant rights, and gives landlords a clear, auditable process that aligns with legal and ethical rental standards.

How it works:

  • Eviction rules (notice period, grace period) are defined at deployment

  • Landlord issues an eviction notice on-chain with a valid reason

  • Notice period countdown begins and is publicly visible

  • Tenant is given a grace window to resolve violations (pay rent, comply)

  • If resolved, eviction is automatically canceled

  • If unresolved after all deadlines, eviction is finalized on-chain

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

/**
 * @title SmartEvictionCompliance
 * @author Nam
 * @notice Enforces legally compliant eviction workflows on-chain
 */
contract SmartEvictionCompliance {

    // -------------------- ROLES --------------------

    address public landlord;
    address public tenant;

    // -------------------- EVICTION RULES --------------------

    uint256 public noticePeriod;     // seconds
    uint256 public gracePeriod;      // seconds

    // -------------------- STATE --------------------

    bool public evictionInitiated;
    bool public violationResolved;
    bool public evictionFinalized;

    uint256 public noticeTimestamp;

    // -------------------- EVENTS --------------------

    event EvictionNoticeIssued(address indexed landlord, string reason);
    event ViolationResolved(address indexed tenant);
    event EvictionCancelled();
    event EvictionFinalized();

    // -------------------- MODIFIERS --------------------

    modifier onlyLandlord() {
        require(msg.sender == landlord, "Not landlord");
        _;
    }

    modifier onlyTenant() {
        require(msg.sender == tenant, "Not tenant");
        _;
    }

    modifier evictionActive() {
        require(evictionInitiated && !evictionFinalized, "No active eviction");
        _;
    }

    // -------------------- CONSTRUCTOR --------------------

    constructor(
        address _tenant,
        uint256 _noticePeriod,
        uint256 _gracePeriod
    ) {
        require(_tenant != address(0), "Invalid tenant");

        landlord = msg.sender;
        tenant = _tenant;

        noticePeriod = _noticePeriod;
        gracePeriod = _gracePeriod;
    }

    // -------------------- EVICTION LOGIC --------------------

    /**
     * @notice Issue an eviction notice with legal notice period
     */
    function issueEvictionNotice(string calldata _reason)
        external
        onlyLandlord
    {
        require(!evictionInitiated, "Eviction already initiated");

        evictionInitiated = true;
        noticeTimestamp = block.timestamp;

        emit EvictionNoticeIssued(msg.sender, _reason);
    }

    /**
     * @notice Tenant resolves the violation during grace period
     */
    function resolveViolation()
        external
        onlyTenant
        evictionActive
    {
        require(
            block.timestamp  noticeTimestamp + noticePeriod + gracePeriod,
            "Eviction timeline not complete"
        );
        require(!violationResolved, "Violation already resolved");

        evictionFinalized = true;
        emit EvictionFinalized();
    }
}