//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract BurgerTest { //Variables uint256 public burgerCost = 5 ether; uint256 public specialBurgerCost = 8 ether; event BoughtBurger(address indexed _from, uint256 cost); address owner; mapping(address => uint256) userRefund; bool paused; //Constructor constructor(){ owner = msg.sender; } //State Machine enum Stages { readyToOrder, makingOrder, readyToDeliver } Stages public actualState = Stages.readyToOrder; //Modifiers modifier ShouldPay(){ require(msg.value == burgerCost || msg.value == specialBurgerCost, "You're trying to fk me?"); _; } modifier requiredState(Stages _stage){ require(actualState == _stage, "Doing what you want?"); _; } modifier onlyOwner(){ require(msg.sender == owner, "Hey hey where you going mf"); _; } modifier emergencyButton(){ require(paused == false); _; } //Functions function buyBurger(uint256 _price) public payable ShouldPay() requiredState(Stages.readyToOrder) emergencyButton(){ emit BoughtBurger(msg.sender, _price); } function refundBurger(address _to, uint256 _cost) public payable onlyOwner() ShouldPay(){ require(address(this).balance >= _cost, "I wont get broke 4 u "); userRefund[_to] == _cost; } function getBalance() public view returns(uint256){ return address(this).balance; } function claimRefund () public{ uint256 refund = userRefund[msg.sender]; userRefund[msg.sender] = 0; (bool success, ) = payable(msg.sender).call{value: refund}(""); require(success); } function pauseThis(bool _state) public onlyOwner(){ paused = _state; } //Extra Functions function takingOrder() public requiredState(Stages.readyToOrder) { updateState(Stages.makingOrder); } function madeBurger() public requiredState(Stages.makingOrder){ updateState(Stages.readyToDeliver); } function deliverBurger() public requiredState(Stages.readyToDeliver){ updateState(Stages.readyToOrder); } function updateState(Stages _stage) public{ actualState = _stage; } }
0.4.18