Ownable.sol
pragma solidity 0.6.6;
contract Ownable {
address payable public owner;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
constructor() public {
owner = msg.sender;
}
}
Destroyable.sol
import "./Ownable.sol";
pragma solidity 0.6.6;
contract Destroyable is Ownable{
function close() public onlyOwner { //onlyOwner is custom modifier
selfdestruct(owner); // `owner` is the owners address
}
}
HelloWorld.sol
import "./Ownable.sol";
import "./Destroyable.sol";
pragma solidity 0.6.6;
contract HelloWorld is Ownable, Destroyable{
struct Person {
string name;
uint age;
uint height;
bool senior;
}
event personCreated(string name, bool senior);
event personDeleted(string name, bool senior, address deletedBy);
uint public balance;
mapping(address => Person) public people;
address[] private creators;
modifier costs(uint cost) {
require(msg.value >= cost);
_;
}
function createPerson(string memory name, uint age, uint height) public costs(1 ether) payable {
require(age <= 130, "Age needs to be real");
balance+= 1 ;
Person memory newPerson;
newPerson = Person({
name: name,
age: age,
height: height,
senior: age > 65 ? true : false
});
insertPerson(newPerson);
creators.push(msg.sender);
assert(
keccak256(
abi.encodePacked(
people[msg.sender].name,
people[msg.sender].age,
people[msg.sender].height,
people[msg.sender].senior
)
)
==
keccak256(
abi.encodePacked(
newPerson.name,
newPerson.age,
newPerson.height,
newPerson.senior
)
)
);
emit personCreated(newPerson.name, newPerson.senior);
}
function insertPerson(Person memory newPerson) private {
address creator = msg.sender;
people[creator] = newPerson;
}
function getPerson() public view returns(string memory name, uint age, uint height, bool senior) {
return (
people[msg.sender].name,
people[msg.sender].age,
people[msg.sender].height,
people[msg.sender].senior
);
}
function deletePerson(address creator) public onlyOwner {
string memory name = people[creator].name;
bool senior = people[creator].senior;
delete people[creator];
assert(people[creator].age == 0);
emit personDeleted(name, senior, msg.sender);
}
function getCreator(uint index) public view onlyOwner returns(address) {
return creators[index];
}
}