pragma solidity ^0.5.17;
contract Will {
address owner;
uint fortune;
bool deceased;
constructor() payable public {
owner = msg.sender; // 이 유서를 호출하는 사람
fortune = msg.value; // 전송하는 상속 이더의 양
deceased = false; // 유서 쓸때는 안돌아가셨음
}
// 이 유서를 호출하는 사람은 onwer만 된다
modifier onlyOwner {
require(msg.sender == owner);
_;
}
// 사망했다면 실행하는 함수
modifier mustBeDeceased {
require(deceased == true);
_;
}
// 가족들의 지갑 주소를 배열에 넣을 것이다.
address payable[] familyWallets;
// 주소를 정수형으로 변환시킨다.
mapping(address => uint) inheritance;
// 가족지갑에 지갑주소 넣고, 주소안에 얼마나 이더가 전송되는지 작성
function setInheritance(address payable wallet, uint amount) public onlyOwner{
familyWallets.push(wallet);
inheritance[wallet] = amount;
}
// 각자의 지갑에 자동으로 이더가 전송되는 함수
function payout() private mustBeDeceased {
for(uint i=0; i<familyWallets.length; i++) {
// transfer는 이더를 전송하는 메소드
familyWallets[i].transfer(inheritance[familyWallets[i]]);
}
}
// 유서가 발동되는 시뮬레이션 함수
function hasDeceased() public onlyOwner {
deceased = true;
payout();
}
}
설명은 주석을 통해서 이해하기.
hasDeceased 시뮬레이션 함수가 발동하면 다음처럼 트랜잭션이 발생한다. 2번째 계좌가진 사람에게 5이더, 3번째 계좌가진사람에게 25이더가 전송되었고, 이는 setInheritance 함수에 인자를 Deployed Contracts에서 각각의 주소와 금액으로 저장했기에 가능했다.