//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; contract DepositLock { enum Stages { AcceptingDeposits, FreezingDeposits, ReleasingDeposits } Stages public stage = Stages.AcceptingDeposits; uint public creationTime = block.timestamp; mapping (address => uint) public balances; modifier atStage(Stages _stage) { require(stage == _stage, "Action not allowed Now"); _; } modifier timedTransitions() { if (stage == Stages.AcceptingDeposits && block.timestamp >= creationTime + 1 days) nextStage(); if (stage == Stages.FreezingDeposits && block.timestamp >= creationTime + 8 days) nextStage(); _; } function nextStage() internal { stage = Stages(uint(stage) + 1); } function deposit() public payable timedTransitions atStage(Stages.AcceptingDeposits) { balances[msg.sender] += msg.value; } function withdraw() public timedTransitions atStage(Stages.ReleasingDeposits) { uint amount = balances[msg.sender]; balances[msg.sender] = 0; payable(msg.sender).transfer(amount); } }
0.7.1