// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
pragma abicoder v2;
contract Wallet{
address [] public owners;
uint limit;
struct Transfer{
uint amount;
address payable receiver;
uint approvals;
bool hasBeenSent;
uint id;
}
event TransferRequestCreated(uint _id, uint _amount, address _intiator, address _receiver);
event ApprovalReceived (uint _id, uint _approvals, address approver);
event TransferApproved(uint _id);
Transfer [] transferRequests;
mapping (address => mapping(uint =>bool)) approvals;
mapping (address=>uint) balance;
modifier onlyOwner{
bool owner = false;
for(uint i = 0; i< owners.length; i++){
if (owners[i] == msg.sender){
owner= true;
}
}
require(owner == true);
_;
}
constructor (address [] memory _owners, uint _limit) {
owners = _owners;
limit = _limit;
}
function deposit() public payable {}
function creatTransfer(uint _amount, address payable _receiver) public onlyOwner{
require(balance[msg.sender]>= _amount);
transferRequests.push( Transfer (_amount, _receiver, 0, false, transferRequests.length));
emit TransferRequestCreated(transferRequests.length, _amount, msg.sender, _receiver);
}
function approve (uint _id) public onlyOwner{
require (approvals[msg.sender][_id] == false);
require(transferRequests[_id].hasBeenSent == false);
approvals[msg.sender][_id] = true;
transferRequests[_id].approvals++;
emit ApprovalReceived (_id, transferRequests[_id].approvals, msg.sender);
if(transferRequests[_id].approvals >= limit){
transferRequests[_id].hasBeenSent= true;
transferRequests[_id].receiver.transfer(transferRequests[_id].amount);
emit TransferApproved(_id);
}
}
function getTransferRequests() public view returns (Transfer[] memory){
return transferRequests;
}
function getBalance() public view returns (uint){
return balance[msg.sender];
}
function getContractBalance () public view returns (uint){
return address (this).balance;
}
}