pragma solidity ^0.4.24; contract InsuranceFactory { address[] public deployedContracts; function createInsurance(string name, uint minimum) public { address newInsurance = new Insurance(name, minimum, msg.sender); deployedContracts.push(newInsurance); } function getDeployedContracts() public view returns (address[]) { return deployedContracts; } } contract Insurance { struct Request { string description; uint value; address recipient; bool complete; uint approvalCount; mapping(address => bool) approvals; } Request[] public requests; string public name; uint public minimumContribution; address public creator; uint public memberCount; mapping(address => bool) public members; constructor(string groupName, uint minimum, address sender) public { name = groupName; minimumContribution = minimum; creator = sender; } function join() public payable { require(msg.value >= minimumContribution); require(!members[msg.sender]); members[msg.sender] = true; memberCount++; } function createRequest(string description, uint value) public { require(members[msg.sender]); Request memory newRequest = Request({ description: description, value: value, recipient: msg.sender, complete: false, approvalCount: 0 }); requests.push(newRequest); } function approveRequest(uint index) public { Request storage request = requests[index]; require(members[msg.sender]); require(!request.approvals[msg.sender]); request.approvals[msg.sender] = true; request.approvalCount++; } function finalizeRequest(uint index) public { Request storage request = requests[index]; require(msg.sender == request.recipient); require(request.approvalCount > (memberCount / 2)); require(!request.complete); request.recipient.transfer(request.value); request.complete = true; } function getSummary() public view returns (string, uint, address, uint, uint, uint) { return ( name, minimumContribution, creator, address(this).balance, requests.length, memberCount ); } function getRequestCount() public view returns (uint) { return requests.length; } }
0.4.24