Skip to content

Instantly share code, notes, and snippets.

@ernestognw
Last active December 26, 2018 19:54
Show Gist options
  • Save ernestognw/e1b94641f08cb1db1205144a95e0bb7d to your computer and use it in GitHub Desktop.
Save ernestognw/e1b94641f08cb1db1205144a95e0bb7d to your computer and use it in GitHub Desktop.
// 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