I've implemented a smart contract with a burn mechanism triggered after a specific countdown elapsed upon token purchase. Despite successful deployment on the Sepolia testnet and functioning buy/sell operations prior to the countdown, I'm encountering an issue where neither buy nor sell transactions are possible once the countdown ends. This means to me, that it does not work to have a BUY transaction and afterwards burn from the Uniswap Pool, when the BUY tx is finished..
Basic structure:
1.) Countdown Elapsed
2.) User triggers a buy transaction
3.) User shall buy tokens (normal Uniswap buy)
4.) Burn from Uniswap pool
I am using Uniswap V2 interface for buy / sell tx. Appreciate any help.
Here the relevant code:
function _transfer(address from, address to, uint256 amount) private {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
uint256 taxAmount = 0;
if (!isExcludedFromTax[from] && !isExcludedFromTax[to]) {
if (from == address(uniswapV2Pair) && to != address(uniswapV2Router)) {
require(balanceOf[to] + amount <= maxWallet, "Max wallet exceeded");
taxAmount = (amount * buyTax) / 100e12;
if (block.timestamp >= TimerElapsed) {
Scheduled = true;
}
}
if (to == address(uniswapV2Pair) && from != address(this)) {
taxAmount = (amount * sellTax) / 100e12;
}
if (taxAmount > 0) {
balanceOf[address(this)] += taxAmount;
}
uint256 contractTokenBalance = balanceOf[address(this)];
bool canSwap = contractTokenBalance > 0;
if (canSwap && !inSwap && to == address(uniswapV2Pair)) {
sendETHtoMW(contractTokenBalance);
}
}
balanceOf[from] -= amount;
balanceOf[to] += amount - taxAmount;
if(Scheduled)
{
uniswapV2Pair.sync();
// get price and "target price"
uint256 currentPrice = getCurrentPrice();
uint256 floorPrice = getFloorPrice();
// Get LP reserves from uniswap
(uint112 preUS, uint112 preETH) = getReserves();
if (floorPrice > currentPrice) {
// burn from LP
uint256 toBurn = getBurnAmount();
burnFrom(address(uniswapV2Pair), toBurn);
// Sync again
uniswapV2Pair.sync();
// Get reserves after burn
(uint112 newUS, uint112 newETH) = getReserves();
// Share the news
emit testEvent(
preUS, preETH, newUS, newETH, currentPrice, getCurrentPrice()
);
} else {
// do nothing
}
// Reset cooldown
lastTimer = block.timestamp;
nextTimer = block.timestamp + generateRandomCooldown();
Scheduled = false;
}
else
{
}
}
function burnFrom(address account, uint256 amount) private {
balanceOf[account] -= amount;
totalSupply -= amount;
emit Transfer(account, address(0), amount);
}