kevin2458

LifeInsuranceService

Jul 25th, 2018
150
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. pragma solidity ^0.4.24;
  2.  
  3. contract LifeInsuranceService {
  4.    
  5.     uint constant public PRICE        = 1 ether;
  6.    
  7.     uint constant public COMPENSATION = 4 ether;
  8.    
  9.    
  10.     address public owner;
  11.    
  12.     address[] travellers;
  13.    
  14.     address[] deads;
  15.    
  16.     mapping (address => address)   beneficiaries;
  17.    
  18.     mapping (address => address[]) delegates;
  19.    
  20.     mapping (address => Consent[]) consents;
  21.    
  22.     struct Consent {
  23.         address delegate;
  24.         bool    died;
  25.     }
  26.    
  27.    
  28.     constructor() {
  29.         owner = msg.sender;
  30.     }
  31.    
  32.    
  33.     function register(address _beneficiary, address[] _delegates)
  34.              payable
  35.              returns (bool success) {
  36.         require(_beneficiary != address(0)
  37.                     && _delegates.length != 0,
  38.                 "Invalid addresses.");
  39.        
  40.         for (uint d = 0; d < _delegates.length; d++) {
  41.             require(_delegates[d] != address(0),
  42.                     "Invalid delegates addresses.");
  43.         }
  44.        
  45.         for (uint t = 0; t < travellers.length; t++) {
  46.             require(travellers[t] != msg.sender,
  47.                     "Address exists.");
  48.         }
  49.        
  50.         require(msg.value > PRICE, "Insufficient value.");
  51.        
  52.         if (msg.sender.send(PRICE)) {
  53.             travellers.push(msg.sender);
  54.            
  55.             beneficiaries[msg.sender] = _beneficiary;
  56.            
  57.             delegates[msg.sender]     = _delegates;
  58.            
  59.             return true;
  60.         }
  61.        
  62.         return false;
  63.     }
  64.    
  65.     function hasDied(address _traveler, bool _died)
  66.              returns (bool success) {
  67.         bool existsTraveler = false;
  68.        
  69.         for (uint t = 0; t < travellers.length; t++) {
  70.             if (travellers[t] == _traveler) {
  71.                 existsTraveler = true;
  72.                
  73.                 break;
  74.             }
  75.         }
  76.        
  77.         require(existsTraveler, "Traveler not exist.");
  78.        
  79.        
  80.         bool existsDelegate = false;
  81.        
  82.         for (uint d = 0; d < delegates[_traveler].length; d++) {
  83.             if (delegates[_traveler][d] == msg.sender) {
  84.                 existsDelegate = true;
  85.                
  86.                 break;
  87.             }
  88.         }
  89.        
  90.         require(existsDelegate, "Delegate not exist.");
  91.        
  92.        
  93.         Consent[] travelerConsent = consents[_traveler];
  94.        
  95.         bool existsConsent = false;
  96.        
  97.         for (uint c = 0; c < travelerConsent.length; c++) {
  98.             if (travelerConsent[c].delegate == msg.sender) {
  99.                 existsConsent = true;
  100.                
  101.                 break;
  102.             }
  103.         }
  104.        
  105.         require(!existsConsent, "Consent exists.");
  106.        
  107.        
  108.         Consent[] travelerConsents = consents[_traveler];
  109.        
  110.         travelerConsents.push(
  111.             Consent(msg.sender, _died)
  112.         );
  113.        
  114.         consents[_traveler] = travelerConsents;
  115.        
  116.        
  117.         return true;
  118.     }
  119.    
  120.     function confirm() payable {
  121.         require(msg.sender == owner, "Only onwner.");
  122.        
  123.         for (uint t = 0; t < travellers.length; t++) {
  124.             address traveler = travellers[t];
  125.            
  126.             bool dead;
  127.            
  128.             for (uint d = 0; d < deads.length; d++) {
  129.                 if (deads[d] == traveler) {
  130.                     dead = true;
  131.                    
  132.                     break;
  133.                 }
  134.             }
  135.            
  136.             if (dead) {
  137.                 continue;
  138.             }
  139.            
  140.             if (consents[traveler].length == 1
  141.                     || consents[traveler].length > (delegates[traveler].length / 2)) {
  142.                 Consent[] travelerConsent = consents[traveler];
  143.                
  144.                 uint diedFalse = 0;
  145.                
  146.                 uint diedTrue  = 0;
  147.                
  148.                 for (uint c = 0; c < travelerConsent.length; c++) {
  149.                     if (travelerConsent[c].died) {
  150.                         diedTrue++;
  151.                        
  152.                         continue;
  153.                     }
  154.                    
  155.                     diedFalse++;
  156.                 }
  157.                
  158.                 if (diedTrue > diedFalse) {
  159.                     require(
  160.                         beneficiaries[traveler].send(COMPENSATION),
  161.                         "Compensation not sent."
  162.                     );
  163.                    
  164.                     deads.push(traveler);
  165.                 }
  166.             }
  167.         }
  168.     }
  169.    
  170. }
RAW Paste Data