An interesting note. I accidentally used a higher version compiler and got an error that the msg.sender address is NOT payable. This did not happen with the 0.7.5 compiler.
Does this mean this code could not run on the current Ethereum blockchain?
//SPDX-License-Identifier: UNLICENSED;
pragma solidity >= 0.8.0;
contract Bank {
mapping(address => uint) balance;
address owner;
event depositDone(uint amount, address indexed depositedTo);
event transferTo(uint amount, address accountSender, address accountReceiver);
modifier onlyOwner {
require(msg.sender == owner);
_; //run the function
}
constructor() {
owner = msg.sender;
}
function deposit() public payable 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, "Balance is not sufficient!");
balance[msg.sender] -= amount;
msg.sender.transfer(amount); // (1) footnote
return balance[msg.sender];
}
function getBalance() public view returns (uint) {
return balance[msg.sender];
}
}
(1) compiler version 0.8.0 does this: TypeError: “send” and “transfer” are only available for objects of type “address payable”, not “address”. --> contracts/Bank:31:9: | 31 | msg.sender.transfer(amount); | ^^^^^^^^^^^^^^^^^^^