SplitPay
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract SplitPay {
    uint public minDeposit;
    uint public balance;
    address [] members;
    mapping (address => bool) paid;
    event Submit(
        address indexed sender,
        uint amount,
        uint timestamp
    );
    event PayInvoice(
        address indexed receiver,
        uint amount,
        uint timestamp
    );
    constructor(uint _minDeposit) {
        require(_minDeposit>=1);
        minDeposit = _minDeposit * 1 ether;
    }
    function getContractBalance() external view returns (uint) {
        return address(this).balance;
    }
    function getMembers() external view returns (address[] memory) {
        return members;
    }
    function submit() external payable {
        address _sender = msg.sender;
        uint _amount = msg.value;
        
        require(!paid[_sender],"You have already submitted a payment.");
        require(_amount>=minDeposit,"The submitted amount is less than the minimum required deposit.");
        members.push(_sender);
        paid[_sender]=true;
        balance+=_amount;
        emit Submit(_sender,_amount,block.timestamp);
    }
    function payInvoice(address _receiver,uint _amount) external  {          
        require(
            _amount<=balance,
            "The invoice amount exceeds the available balance."
        );
        require(
            paid[msg.sender],
            "You are not authorized to pay the invoice"
        );
        
        _amount *= 1 ether;
        balance -=_amount;
        (bool success,) = _receiver.call{ value: _amount }("");
        require(success,"Payment of the invoice failed.");
        emit PayInvoice(_receiver, _amount, block.timestamp);
        
        
    }
}
Last updated
