Delay in withdraw can save smart contract from malicious activity. Here is the example how you can apply a delay in smart contract.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract speedbumpPattern{
uint constant withdrawalWaitPeriod = 20 days;
struct withdrawalRequest{
uint amount;
uint time;
}
mapping( address => uint ) balance;
mapping( address => withdrawalRequest ) withdrawalRequests;
function RequestForWithdraw(uint _amount)public {
require(_amount <= balance[msg.sender] && _amount > 0,"Insufficient Balance");
balance[msg.sender] -= _amount;
withdrawalRequests[msg.sender] = withdrawalRequest({
amount: _amount,
time: block.timestamp
});
}
function withdraw()public {
require(withdrawalRequests[msg.sender].amount > 0 && block.timestamp > withdrawalRequests[msg.sender].time + withdrawalWaitPeriod ,"Error in balance or Period for withdraw");
uint withdrawalAmount = withdrawalRequests[msg.sender].amount;
withdrawalRequests[msg.sender].amount = 0;
withdrawalRequests[msg.sender].time = 0;
require(payable(msg.sender).send(withdrawalAmount));
}
}