Transaction Hash:
Block:
18493853 at Nov-03-2023 08:15:59 PM +UTC
Transaction Fee:
0.001245125234566246 ETH
$3.01
Gas Used:
47,234 Gas / 26.360783219 Gwei
Emitted Events:
145 |
Fortnite.Approval( owner=[Sender] 0x778f275ca42685bce22239b05d9dbee6ca31cfd4, spender=0x5200a0E9...ef3e1847a, value=115792089237316195423570985008687907853269984665640564039457584007913129639935 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x1A802d15...Eab3Ccd2D | |||||
0x690B9A9E...Db4FaC990
Miner
| (builder0x69) | 0.943185834304403197 Eth | 0.943422004304403197 Eth | 0.00023617 | |
0x778f275C...6CA31cfd4 |
0.966369689230993076 Eth
Nonce: 107
|
0.96512456399642683 Eth
Nonce: 108
| 0.001245125234566246 |
Execution Trace
Fortnite.approve( spender=0x5200a0E9b161bc59fEeCB165FE2592bef3e1847a, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935 ) => ( True )
approve[ERC20 (ln:94)]
_msgSender[ERC20 (ln:98)]
_approve[ERC20 (ln:99)]
Approval[ERC20 (ln:185)]
/* https://t.me/fortethtelegram */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * OpenZeppelin Contracts v4.4.1 (utils/Context.sol) */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) */ interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance( address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address from, address to, uint256 amount ) external returns (bool); } /** * OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } /** * OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } function transfer( address to, uint256 amount ) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve( address spender, uint256 amount ) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } function increaseAllowance( address spender, uint256 addedValue ) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } function decreaseAllowance( address spender, uint256 subtractedValue ) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _transferOwnership(_msgSender()); } modifier onlyOwner() { _checkOwner(); _; } function owner() public view virtual returns (address) { return _owner; } function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); } interface IDexFactory { function createPair( address tokenA, address tokenB ) external returns (address pair); } contract Fortnite is ERC20, Ownable { uint256 public maxBuyAmount; uint256 public maxSellAmount; uint256 public maxWalletAmount; IDexRouter public dexRouter; address public lpPair; bool private swapping; uint256 public swapTokensAtAmount; address taxAddress; uint256 public tradingActiveBlock = 0; uint256 public blockForPenaltyEnd; mapping(address => bool) public boughtEarly; uint256 public botsCaught; bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; bool public swapToEth = true; mapping(address => uint256) private _holderLastTransferTimestamp; bool public transferDelayEnabled = true; uint256 public buyTotalFees; uint256 public buyTaxFee; uint256 public sellTotalFees; uint256 public sellTaxFee; uint256 public tokensForTax; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; mapping(address => bool) public automatedMarketMakerPairs; event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event EnabledTrading(); event RemovedLimits(); event ExcludeFromFees(address indexed account, bool isExcluded); event UpdatedMaxBuyAmount(uint256 newAmount); event UpdatedMaxSellAmount(uint256 newAmount); event UpdatedMaxWalletAmount(uint256 newAmount); event MaxTransactionExclusion(address _address, bool excluded); event OwnerForcedSwapBack(uint256 timestamp); event CaughtEarlyBuyer(address sniper); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity ); constructor() ERC20("Fortnite OG", "FORT") { address contractOwner = msg.sender; IDexRouter _dexRouter = IDexRouter( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); dexRouter = _dexRouter; lpPair = IDexFactory(_dexRouter.factory()).createPair( address(this), _dexRouter.WETH() ); _excludeFromMaxTransaction(address(lpPair), true); _setAutomatedMarketMakerPair(address(lpPair), true); uint256 totalSupply = 100_000_000_000 * 1e18; //100_000_000_000 maxBuyAmount = (totalSupply * 10) / 1000; maxSellAmount = (totalSupply * 10) / 1000; maxWalletAmount = (totalSupply * 10) / 1000; swapTokensAtAmount = (totalSupply * 1) / 1000; // Initial buy and sell fees to punish bots buyTaxFee = 7; buyTotalFees = buyTaxFee; sellTaxFee = 10; sellTotalFees = sellTaxFee; taxAddress = msg.sender; _excludeFromMaxTransaction(contractOwner, true); _excludeFromMaxTransaction(address(this), true); _excludeFromMaxTransaction(address(0xdead), true); _excludeFromMaxTransaction(taxAddress, true); excludeFromFees(contractOwner, true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromFees(taxAddress, true); _mint(contractOwner, totalSupply); transferOwnership(contractOwner); } receive() external payable {} function enableTrading(uint256 deadBlocks) external onlyOwner { require(!tradingActive, "Cannot reenable trading"); tradingActive = true; swapEnabled = true; tradingActiveBlock = block.number; blockForPenaltyEnd = tradingActiveBlock + deadBlocks; emit EnabledTrading(); } function removeLimits() external onlyOwner { limitsInEffect = false; transferDelayEnabled = false; emit RemovedLimits(); } function manageBoughtEarly(address wallet, bool flag) external onlyOwner { boughtEarly[wallet] = flag; } function massManageBoughtEarly( address[] calldata wallets, bool flag ) external onlyOwner { for (uint256 i = 0; i < wallets.length; i++) { boughtEarly[wallets[i]] = flag; } } function disableTransferDelay() external onlyOwner { transferDelayEnabled = false; } function updateMaxBuyAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 2) / 1000) / 1e18, "Cannot set max buy amount lower than 0.2%" ); maxBuyAmount = newNum * (10 ** 18); emit UpdatedMaxBuyAmount(maxBuyAmount); } function updateMaxSellAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 2) / 1000) / 1e18, "Cannot set max sell amount lower than 0.2%" ); maxSellAmount = newNum * (10 ** 18); emit UpdatedMaxSellAmount(maxSellAmount); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 3) / 1000) / 1e18, "Cannot set max wallet amount lower than 0.3%" ); maxWalletAmount = newNum * (10 ** 18); emit UpdatedMaxWalletAmount(maxWalletAmount); } function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner { require( newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply." ); require( newAmount <= (totalSupply() * 1) / 1000, "Swap amount cannot be higher than 0.1% total supply." ); swapTokensAtAmount = newAmount; } function _excludeFromMaxTransaction( address updAds, bool isExcluded ) private { _isExcludedMaxTransactionAmount[updAds] = isExcluded; emit MaxTransactionExclusion(updAds, isExcluded); } function excludeFromMaxTransaction( address updAds, bool isEx ) external onlyOwner { if (!isEx) { require( updAds != lpPair, "Cannot remove Uniswap pair from max txn" ); } _isExcludedMaxTransactionAmount[updAds] = isEx; } function setAutomatedMarketMakerPair( address pair, bool value ) external onlyOwner { require( pair != lpPair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); emit SetAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; _excludeFromMaxTransaction(pair, value); emit SetAutomatedMarketMakerPair(pair, value); } function setSwapToEth(bool _swapToEth) public onlyOwner { swapToEth = _swapToEth; } function updateBuyFees(uint256 _taxFee) external onlyOwner { buyTaxFee = _taxFee; buyTotalFees = buyTaxFee; require(buyTotalFees <= 10, "Must keep fees at 10% or less."); } function updateSellFees(uint256 _taxFee) external onlyOwner { sellTaxFee = _taxFee; sellTotalFees = sellTaxFee; require(sellTotalFees <= 10, "Must keep fees at 10% or less."); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "amount must be greater than 0"); if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } if (blockForPenaltyEnd > 0) { require( !boughtEarly[from] || to == owner() || to == address(0xdead), "Bots cannot transfer tokens in or out except to owner or dead address." ); } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { if (transferDelayEnabled) { if (to != address(dexRouter) && to != address(lpPair)) { require( _holderLastTransferTimestamp[tx.origin] < block.number - 2 && _holderLastTransferTimestamp[to] < block.number - 2, "_transfer:: Transfer Delay enabled. Try again later." ); _holderLastTransferTimestamp[tx.origin] = block.number; _holderLastTransferTimestamp[to] = block.number; } } if ( automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to] ) { require( amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy." ); require( amount + balanceOf(to) <= maxWalletAmount, "Cannot exceed max wallet." ); } else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from] ) { require( amount <= maxSellAmount, "Sell transfer amount exceeds the max sell." ); } else if (!_isExcludedMaxTransactionAmount[to]) { require( amount + balanceOf(to) <= maxWalletAmount, "Cannot exceed max wallet." ); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } bool takeFee = true; if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; if (takeFee) { if ( earlyBuyPenaltyInEffect() && automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] && buyTotalFees > 0 ) { if (!boughtEarly[to]) { boughtEarly[to] = true; botsCaught += 1; emit CaughtEarlyBuyer(to); } fees = (amount * 99) / 100; tokensForTax += (fees * buyTaxFee) / buyTotalFees; } else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = (amount * sellTotalFees) / 100; tokensForTax += (fees * sellTaxFee) / sellTotalFees; } else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = (amount * buyTotalFees) / 100; tokensForTax += (fees * buyTaxFee) / buyTotalFees; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function earlyBuyPenaltyInEffect() public view returns (bool) { return block.number < blockForPenaltyEnd; } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WETH(); _approve(address(this), address(dexRouter), tokenAmount); dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForTax; if (contractBalance == 0 || totalTokensToSwap == 0) { return; } if (contractBalance > swapTokensAtAmount * 20) { contractBalance = swapTokensAtAmount * 20; } bool success; if (swapToEth) { swapTokensForEth(contractBalance); tokensForTax = 0; (success, ) = address(taxAddress).call{ value: address(this).balance }(""); } if (!swapToEth) { _transfer(address(this), taxAddress, contractBalance); tokensForTax = 0; success = true; } } // Withdraw ETH from contract address function withdrawStuckETH() external onlyOwner { bool success; (success, ) = address(msg.sender).call{value: address(this).balance}( "" ); } function updateTaxAddress(address _taxAddress) external onlyOwner { require(_taxAddress != address(0), "_taxAddress address cannot be 0"); taxAddress = payable(_taxAddress); } function forceSwapBack() external onlyOwner { require( balanceOf(address(this)) >= swapTokensAtAmount, "Can only swap when token amount is at or higher than restriction" ); swapping = true; swapBack(); swapping = false; emit OwnerForcedSwapBack(block.timestamp); } }