Skip to content

Instantly share code, notes, and snippets.

@vasa-develop
Created July 21, 2018 18:21
Show Gist options
  • Save vasa-develop/9c9df906c0f929b7088ffb62d94c8507 to your computer and use it in GitHub Desktop.
Save vasa-develop/9c9df906c0f929b7088ffb62d94c8507 to your computer and use it in GitHub Desktop.
THIS CODE IS SAFE.
contract EtherStore {
// initialise the mutex
bool reEntrancyMutex = false;
uint256 public withdrawalLimit = 1 ether;
mapping(address => uint256) public lastWithdrawTime;
mapping(address => uint256) public balances;
function depositFunds() public payable {
balances[msg.sender] += msg.value;
}
function withdrawFunds (uint256 _weiToWithdraw) public {
require(!reEntrancyMutex);
require(balances[msg.sender] >= _weiToWithdraw);
// limit the withdrawal
require(_weiToWithdraw <= withdrawalLimit);
// limit the time allowed to withdraw
require(now >= lastWithdrawTime[msg.sender] + 1 weeks);
balances[msg.sender] -= _weiToWithdraw;
lastWithdrawTime[msg.sender] = now;
// set the reEntrancy mutex before the external call
reEntrancyMutex = true;
msg.sender.transfer(_weiToWithdraw);
// release the mutex after the external call
reEntrancyMutex = false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment