Adding a forgotten assignment, It has a little Extra on it, meaning it has a little more code to it then the lecture requires.
Bank
pragma solidity 0.7.5;
import “./Ownable.sol”;
import “./Destroyable.sol”;
interface GovernmentInterface {
function addTransaction(address _from, address _to, uint _amount) external;
}
contract Bank is Ownable, Destroyable {
GovernmentInterface governmentInstance = GovernmentInterface(0xaE036c65C649172b43ef7156b009c6221B596B8b);
mapping(address => uint)balance;
event depositDone(uint amount, address indexed depositTo);
event transferDone(address from, address to, uint amount);
function deposit() public payable onlyOwner returns(uint) {
balance[msg.sender] += msg.value;
emit depositDone(msg.value, msg.sender);
return balance[msg.sender];
}
function withdraw(uint amount) public returns(uint) {
require(balance[msg.sender] >= amount);
msg.sender.transfer(amount);
return balance[msg.sender];
}
function getBalance() public view returns(uint) {
return balance[msg.sender];
}
function transfer(address recipient, uint amount) public {
require(balance[msg.sender] >= amount);
require(msg.sender != recipient);
uint balanceBeforeSending = balance[msg.sender];
_transfer(msg.sender, recipient, amount);
governmentInstance.addTransaction(msg.sender, recipient, amount);
assert(balance[msg.sender] == balanceBeforeSending - amount);
}
function _transfer(address from, address to, uint amount) private {
balance[from] -= amount;
balance[to] += amount;
emit transferDone(from, to, amount);
}
}
Ownable
pragma solidity 0.7.5;
contract Ownable {
address internal owner;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
constructor() {
owner = msg.sender;
}
}
Destroyable
pragma solidity 0.7.5;
import “./Ownable.sol”;
contract Destroyable is Ownable {
function Destroy() public onlyOwner {
address payable recipient = msg.sender;
selfdestruct(recipient);
}
}