Last active
December 26, 2018 19:54
-
-
Save ernestognw/e1b94641f08cb1db1205144a95e0bb7d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Seguro de vida de viajero | |
| // 1.- Comprar un seguro y asignar a un beneficiario | |
| // 2.- El "gobierno" valida si falleció | |
| // 3.- La "agencia" declara si estaba viajando para validar el seguro | |
| // 4.- Se paga al beneficiario el doble del costo del seguro | |
| // 5.- La agencia retira el sobrante | |
| pragma solidity ^0.4.24; | |
| contract Assurance { | |
| // Declaracion de variables | |
| address assurer; // Agencia que asegura al viajero | |
| address government; // Entidad gubernamental que valida el fallecimiento | |
| uint price = 1 ether; // Precio del seguro | |
| mapping (address => assured) public users; // Lista de usuarios asegurados | |
| struct assured { | |
| address beneficiary; | |
| bool wasTraveling; // Campo que debe validar la agencia de seguros | |
| bool isAssured; // Campo que determina si el usuario tiene seguro o no | |
| bool isLegallyDead; // Campo que debe validar el gobierno | |
| } | |
| constructor(address _government){ | |
| assurer = msg.sender; // La agencia de seguros es quien instancia el contrato | |
| government = _government; // Dirección del gobierno que debe validar los fallecimientos | |
| } | |
| // Declaracion de modificadores | |
| // Estos son funciones que limitan el acceso a los métodos del contrato | |
| modifier onlyGovernment(){ | |
| if(government != msg.sender) | |
| revert("Only government can make this operation"); | |
| _; | |
| } | |
| modifier onlyAssurer(){ | |
| if(assurer != msg.sender) | |
| revert("Only assurer agency can make this operation"); | |
| _; | |
| } | |
| // Declaración de métodos | |
| // Comprar Seguro y asignar beneficiario | |
| function BuyAssurance(address _beneficiary) public payable { | |
| if(msg.value < price || users[msg.sender].isLegallyDead != false || users[msg.sender].isAssured != false) { | |
| revert("Something has gone wrong"); | |
| } | |
| if (msg.value > price) { | |
| msg.sender.transfer(msg.value - price); | |
| } | |
| users[msg.sender].isAssured = true; | |
| users[msg.sender].beneficiary = _beneficiary; | |
| } | |
| // Certifica que alguien está muerto | |
| function certifyDead(address _deadGuy) public onlyGovernment(){ | |
| users[_deadGuy].isLegallyDead = true; | |
| } | |
| // Certifica si el sujeto que ha fallecido estaba viajando | |
| function certifyTraveling(address _traveler) public onlyAssurer() { | |
| users[_traveler].wasTraveling = true; | |
| } | |
| // Cobrar el seguro si estaba viajando, si estaba asegurado y si esta legalmente muerto | |
| function collect(address _supposedDeadGuy) public payable onlyAssurer(){ | |
| if(!users[_supposedDeadGuy].isLegallyDead || !users[_supposedDeadGuy].wasTraveling || !users[_supposedDeadGuy].isAssured){ | |
| revert("Something has gone wrong"); | |
| } | |
| users[_supposedDeadGuy].beneficiary.transfer(2*price); | |
| } | |
| // Regresa la utilidad a la aseguradora | |
| function cashOut() public payable onlyAssurer() { | |
| msg.sender.transfer(this.balance); | |
| } | |
| // Checa las variables de usuarios | |
| function infoUser(address _user) public view returns(address, bool, bool, bool){ | |
| return (users[_user].beneficiario, users[_user].isAssured, users[_user].isLegallyDead, users[_user].wasTraveling); | |
| } | |
| // Checa el balance del contrato | |
| function checkContractBalance() public view returns(uint){ | |
| return (this.balance); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment