Transaction Hash:
Block:
22854032 at Jul-05-2025 03:52:47 PM +UTC
Transaction Fee:
0.000069135280688172 ETH
$0.18
Gas Used:
46,626 Gas / 1.482762422 Gwei
Emitted Events:
29 |
Kounotori.Approval( owner=[Sender] 0xd3c5e200f351e4c3635ac6556bba699da736d5fb, spender=0x881D4023...dC08D300C, value=115792089237316195423570985008687907853269984665640564039457584007913129639935 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x616ef40D...0b79BF8fC | |||||
0xD3c5e200...da736d5FB |
0.066308970203694021 Eth
Nonce: 148
|
0.066239834923005849 Eth
Nonce: 149
| 0.000069135280688172 | ||
0xdadB0d80...24f783711
Miner
| (BuilderNet) | 29.338233764677389763 Eth | 29.338280390677576267 Eth | 0.000046626000186504 |
Execution Trace
Kounotori.approve( spender=0x881D40237659C251811CEC9c364ef91dC08D300C, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935 ) => ( True )
approve[Kounotori (ln:439)]
_approve[Kounotori (ln:440)]
Approval[Kounotori (ln:449)]
_msgSender[Kounotori (ln:440)]
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; abstract contract Context { function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/od/ai/nu/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address lpPair, uint); function getPair(address tokenA, address tokenB) external view returns (address lpPair); function createPair(address tokenA, address tokenB) external returns (address lpPair); } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function factory() external view returns (address); } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } interface IUniswapV2Router02 is IUniswapV2Router01 { function swapExactTokensForTokensSupportingFeeOnTransferTokens( 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 swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface AntiSnipe { function checkUser(address from, address to, uint256 amt) external returns (bool); function setLaunch(address _initialLpPair, uint32 _liqAddBlock, uint64 _liqAddStamp) external; function setLpPair(address pair, bool enabled) external; function setProtections(bool _as, bool _ag, bool _ab, bool _aspecial) external; function setGasPriceLimit(uint256 gas) external; function removeSniper(address account) external; function getSniperAmt() external view returns (uint256); function removeBlacklisted(address account) external; function isBlacklisted(address account) external view returns (bool); } contract Kounotori is Context, IERC20Upgradeable { // Ownership moved to in-contract for customizability. address private _owner; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => bool) lpPairs; uint256 private timeSinceLastPair = 0; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) private _isExcludedFromLimits; mapping (address => bool) private _isExcluded; address[] private _excluded; bool private allowedPresaleExclusion = true; mapping (address => bool) private _isSniper; mapping (address => bool) private _liquidityHolders; uint256 private startingSupply; string private _name; string private _symbol; struct FeesStruct { uint16 reflectFee; uint16 liquidityFee; uint16 marketingFee; } struct StaticValuesStruct { uint16 maxReflectFee; uint16 maxLiquidityFee; uint16 maxMarketingFee; uint16 masterTaxDivisor; } struct Ratios { uint16 liquidityRatio; uint16 marketingRatio; uint16 totalRatio; } FeesStruct private currentTaxes = FeesStruct({ reflectFee: 0, liquidityFee: 0, marketingFee: 0 }); FeesStruct public _buyTaxes = FeesStruct({ reflectFee: 300, liquidityFee: 300, marketingFee: 300 }); FeesStruct public _sellTaxes = FeesStruct({ reflectFee: 300, liquidityFee: 300, marketingFee: 300 }); FeesStruct public _transferTaxes = FeesStruct({ reflectFee: 300, liquidityFee: 300, marketingFee: 300 }); Ratios public _ratios = Ratios({ liquidityRatio: _buyTaxes.liquidityFee, marketingRatio: _buyTaxes.marketingFee, totalRatio: _buyTaxes.liquidityFee + _buyTaxes.marketingFee }); StaticValuesStruct public staticVals = StaticValuesStruct({ maxReflectFee: 800, maxLiquidityFee: 800, maxMarketingFee: 800, masterTaxDivisor: 10000 }); uint256 private constant MAX = ~uint256(0); uint8 private _decimals; uint256 private _tTotal; uint256 private _rTotal; uint256 private _tFeeTotal; IUniswapV2Router02 public dexRouter; address public lpPair; address public currentRouter; // PCS ROUTER address private pcsV2Router = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // UNI ROUTER address private uniswapV2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address constant public DEAD = 0x000000000000000000000000000000000000dEaD; address payable private _marketingWallet = payable(0x990C36e0871857534a55F8f756cDecF360d59B08); bool inSwap; bool public contractSwapEnabled = false; uint256 private _maxTxAmount; uint256 public maxTxAmountUI; uint256 private _maxWalletSize; uint256 public maxWalletSizeUI; uint256 private swapThreshold; uint256 private swapAmount; bool public tradingEnabled = false; bool public _hasLiqBeenAdded = false; AntiSnipe antiSnipe; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event ContractSwapEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SniperCaught(address sniperAddress); modifier lockTheSwap { inSwap = true; _; inSwap = false; } modifier onlyOwner() { require(_owner == _msgSender(), "Caller =/= owner."); _; } constructor () payable { // Set the owner. _owner = msg.sender; if (block.chainid == 56 || block.chainid == 97) { currentRouter = pcsV2Router; } else if (block.chainid == 1) { currentRouter = uniswapV2Router; } _approve(_msgSender(), currentRouter, type(uint256).max); _approve(address(this), currentRouter, type(uint256).max); _isExcludedFromFees[owner()] = true; _isExcludedFromFees[address(this)] = true; _isExcludedFromFees[DEAD] = true; _liquidityHolders[owner()] = true; } bool contractInitialized = false; function intializeContract(address[] memory accounts, uint256[] memory amounts, address newOwner) external onlyOwner { require(!contractInitialized, "1"); require(accounts.length < 100, "2"); require(accounts.length == amounts.length, "3"); _name = "Kounotori"; _symbol = "KTO"; startingSupply = 1_000_000_000_000_000; if (startingSupply < 10000000000) { _decimals = 18; } else { _decimals = 9; } _tTotal = startingSupply * (10**_decimals); _rTotal = (MAX - (MAX % _tTotal)); dexRouter = IUniswapV2Router02(currentRouter); lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this)); lpPairs[lpPair] = true; uint256 percent = 2; uint256 divisor = 1000; _maxTxAmount = (_tTotal * percent) / divisor; maxTxAmountUI = (startingSupply * percent) / divisor; percent = 55; divisor = 10000; _maxWalletSize = (_tTotal * percent) / divisor; maxWalletSizeUI = (startingSupply * percent) / divisor; swapThreshold = (_tTotal * 5) / 10000; swapAmount = (_tTotal * 5) / 1000; if(address(antiSnipe) == address(0)){ antiSnipe = AntiSnipe(address(this)); } contractInitialized = true; _rOwned[owner()] = _rTotal; emit Transfer(address(0), owner(), _tTotal); _approve(address(this), address(dexRouter), type(uint256).max); for(uint256 i = 0; i < accounts.length; i++){ address wallet = accounts[i]; uint256 amount = amounts[i]*10**_decimals; _transfer(owner(), wallet, amount); } _transfer(owner(), address(this), balanceOf(owner())); dexRouter.addLiquidityETH{value: address(this).balance}( address(this), balanceOf(address(this)), 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); enableTrading(); transferOwner(newOwner); } receive() external payable {} //=============================================================================================================== //=============================================================================================================== //=============================================================================================================== // Ownable removed as a lib and added here to allow for custom transfers and recnouncements. // This allows for removal of ownership privelages from the owner once renounced or transferred. function owner() public view returns (address) { return _owner; } function transferOwner(address newOwner) public onlyOwner() { require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address."); require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address."); setExcludedFromFees(_owner, false); setExcludedFromFees(newOwner, true); if (tradingEnabled){ setExcludedFromReward(newOwner, true); } if (_marketingWallet == payable(_owner)) _marketingWallet = payable(newOwner); if(balanceOf(_owner) > 0) { _transfer(_owner, newOwner, balanceOf(_owner)); } _owner = newOwner; emit OwnershipTransferred(_owner, newOwner); } function renounceOwnership() public virtual onlyOwner() { setExcludedFromFees(_owner, false); _owner = address(0); emit OwnershipTransferred(_owner, address(0)); } //=============================================================================================================== //=============================================================================================================== //=============================================================================================================== function totalSupply() external view override returns (uint256) { return _tTotal; } function decimals() external view returns (uint8) { return _decimals; } function symbol() external view returns (string memory) { return _symbol; } function name() external view returns (string memory) { return _name; } function getOwner() external view returns (address) { return owner(); } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function _approve(address sender, address spender, uint256 amount) private { require(sender != address(0), "ERC20: Zero Address"); require(spender != address(0), "ERC20: Zero Address"); _allowances[sender][spender] = amount; emit Approval(sender, spender, amount); } function approveContractContingency() public onlyOwner returns (bool) { _approve(address(this), address(dexRouter), type(uint256).max); return true; } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if (_allowances[sender][msg.sender] != type(uint256).max) { _allowances[sender][msg.sender] -= amount; } return _transfer(sender, recipient, amount); } 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); return true; } function setNewRouter(address newRouter) public onlyOwner() { IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter); address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH()); if (get_pair == address(0)) { lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH()); } else { lpPair = get_pair; } dexRouter = _newRouter; _approve(address(this), address(dexRouter), type(uint256).max); } function setLpPair(address pair, bool enabled) external onlyOwner { if (enabled == false) { lpPairs[pair] = false; antiSnipe.setLpPair(pair, false); } else { if (timeSinceLastPair != 0) { require(block.timestamp - timeSinceLastPair > 1 weeks, "Cannot set a new pair this week!"); } lpPairs[pair] = true; timeSinceLastPair = block.timestamp; antiSnipe.setLpPair(pair, true); } } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function isExcludedFromLimits(address account) public view returns(bool) { return _isExcludedFromLimits[account]; } function setExcludedFromFees(address account, bool enabled) public onlyOwner { _isExcludedFromFees[account] = enabled; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function setExcludedFromLimits(address account, bool enabled) external onlyOwner { _isExcludedFromLimits[account] = enabled; } function setExcludedFromReward(address account, bool enabled) public onlyOwner { if (enabled == true) { require(!_isExcluded[account], "Account is already excluded."); if(_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } else if (enabled == false) { require(_isExcluded[account], "Account is already included."); if(_excluded.length == 1){ _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); } else { for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } } } function setInitializer(address initializer) external onlyOwner { require(!_hasLiqBeenAdded, "Liquidity is already in."); antiSnipe = AntiSnipe(initializer); } function removeSniper(address account) external onlyOwner { antiSnipe.removeSniper(account); } function isBlacklisted(address account) public view returns (bool) { return antiSnipe.isBlacklisted(account); } function removeBlacklisted(address account) external onlyOwner { antiSnipe.removeBlacklisted(account); } function getSniperAmt() public view returns (uint256) { return antiSnipe.getSniperAmt(); } function setProtectionSettings(bool _antiSnipe, bool _antiGas, bool _antiBlock, bool _antiSpecial) external onlyOwner { antiSnipe.setProtections(_antiSnipe, _antiGas, _antiBlock, _antiSpecial); } function setGasPriceLimit(uint256 gas) external onlyOwner { require(gas >= 75, "Too low."); antiSnipe.setGasPriceLimit(gas); } function setTaxesBuy(uint16 reflectFee, uint16 liquidityFee, uint16 marketingFee) external onlyOwner { require(reflectFee <= staticVals.maxReflectFee && liquidityFee <= staticVals.maxLiquidityFee && marketingFee <= staticVals.maxMarketingFee); require(liquidityFee + reflectFee + marketingFee <= 3450); _buyTaxes.liquidityFee = liquidityFee; _buyTaxes.reflectFee = reflectFee; _buyTaxes.marketingFee = marketingFee; } function setTaxesSell(uint16 reflectFee, uint16 liquidityFee, uint16 marketingFee) external onlyOwner { require(reflectFee <= staticVals.maxReflectFee && liquidityFee <= staticVals.maxLiquidityFee && marketingFee <= staticVals.maxMarketingFee); require(liquidityFee + reflectFee + marketingFee <= 3450); _sellTaxes.liquidityFee = liquidityFee; _sellTaxes.reflectFee = reflectFee; _sellTaxes.marketingFee = marketingFee; } function setTaxesTransfer(uint16 reflectFee, uint16 liquidityFee, uint16 marketingFee) external onlyOwner { require(reflectFee <= staticVals.maxReflectFee && liquidityFee <= staticVals.maxLiquidityFee && marketingFee <= staticVals.maxMarketingFee); require(liquidityFee + reflectFee + marketingFee <= 3450); _transferTaxes.liquidityFee = liquidityFee; _transferTaxes.reflectFee = reflectFee; _transferTaxes.marketingFee = marketingFee; } function setRatios(uint16 liquidity, uint16 marketing) external onlyOwner { require (liquidity + marketing == 100, "Must add up to 100%"); _ratios.liquidityRatio = liquidity; _ratios.marketingRatio = marketing; _ratios.totalRatio = liquidity + marketing; } function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner { uint256 check = (_tTotal * percent) / divisor; require(check >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply."); _maxTxAmount = check; maxTxAmountUI = (startingSupply * percent) / divisor; } function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner { uint256 check = (_tTotal * percent) / divisor; require(check >= (_tTotal / 1000), "Max Wallet amt must be above 0.1% of total supply."); _maxWalletSize = check; maxWalletSizeUI = (startingSupply * percent) / divisor; } function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner { swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor; swapAmount = (_tTotal * amountPercent) / amountDivisor; } function setWallets(address payable marketingWallet) external onlyOwner { _marketingWallet = payable(marketingWallet); } function setContractSwapEnabled(bool _enabled) public onlyOwner { contractSwapEnabled = _enabled; emit ContractSwapEnabledUpdated(_enabled); } function _hasLimits(address from, address to) private view returns (bool) { return from != owner() && to != owner() && !_liquidityHolders[to] && !_liquidityHolders[from] && to != DEAD && to != address(0) && from != address(this); } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount / currentRate; } function _transfer(address from, address to, uint256 amount) internal returns (bool) { 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"); if(_hasLimits(from, to)) { if(!tradingEnabled) { revert("Trading not yet enabled!"); } if(lpPairs[from] || lpPairs[to]){ if (!(_isExcludedFromLimits[to] || _isExcludedFromLimits[from])){ require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } } if(to != currentRouter && !lpPairs[to]) { if(!_isExcludedFromLimits[to]) { require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize."); } } } bool takeFee = true; if(_isExcludedFromFees[from] || _isExcludedFromFees[to]){ takeFee = false; } if (lpPairs[to]) { if (!inSwap && contractSwapEnabled ) { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= swapThreshold) { if(contractTokenBalance >= swapAmount) { contractTokenBalance = swapAmount; } contractSwap(contractTokenBalance); } } } return _finalizeTransfer(from, to, amount, takeFee); } function contractSwap(uint256 contractTokenBalance) private lockTheSwap { if (_ratios.totalRatio == 0) return; if(_allowances[address(this)][address(dexRouter)] != type(uint256).max) { _allowances[address(this)][address(dexRouter)] = type(uint256).max; } uint256 toLiquify = ((contractTokenBalance * _ratios.liquidityRatio) / _ratios.totalRatio) / 2; uint256 toSwapForEth = contractTokenBalance - toLiquify; address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WETH(); dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( toSwapForEth, 0, // accept any amount of ETH path, address(this), block.timestamp ); //uint256 currentBalance = address(this).balance; uint256 liquidityBalance = ((address(this).balance * _ratios.liquidityRatio) / _ratios.totalRatio) / 2; if (toLiquify > 0) { dexRouter.addLiquidityETH{value: liquidityBalance}( address(this), toLiquify, 0, // slippage is unavoidable 0, // slippage is unavoidable DEAD, block.timestamp ); emit SwapAndLiquify(toLiquify, liquidityBalance, toLiquify); } if (contractTokenBalance - toLiquify > 0) { _marketingWallet.transfer(address(this).balance); } } function _checkLiquidityAdd(address from, address to) private { require(!_hasLiqBeenAdded, "Liquidity already added and marked."); if (!_hasLimits(from, to) && to == lpPair) { if (from == address(this)){ _liquidityHolders[owner()] = true; } else { _liquidityHolders[from] = true; } _hasLiqBeenAdded = true; if(address(antiSnipe) == address(0)){ antiSnipe = AntiSnipe(address(this)); } contractSwapEnabled = true; emit ContractSwapEnabledUpdated(true); } } function enableTrading() public onlyOwner { require(!tradingEnabled, "Trading already enabled!"); require(_hasLiqBeenAdded, "Liquidity must be added."); setExcludedFromReward(address(this), true); setExcludedFromReward(lpPair, true); if(address(antiSnipe) == address(0)){ antiSnipe = AntiSnipe(address(this)); } try antiSnipe.setLaunch(lpPair, uint32(block.number), uint64(block.timestamp)) {} catch {} tradingEnabled = true; } struct ExtraValues { uint256 tTransferAmount; uint256 tFee; uint256 tLiquidity; uint256 rTransferAmount; uint256 rAmount; uint256 rFee; } function _finalizeTransfer(address from, address to, uint256 tAmount, bool takeFee) private returns (bool) { if (!_hasLiqBeenAdded) { _checkLiquidityAdd(from, to); if (!_hasLiqBeenAdded && _hasLimits(from, to)) { revert("Only owner can transfer at this time."); } } ExtraValues memory values = _getValues(from, to, tAmount, takeFee); _rOwned[from] = _rOwned[from] - values.rAmount; _rOwned[to] = _rOwned[to] + values.rTransferAmount; if (_isExcluded[from] && !_isExcluded[to]) { _tOwned[from] = _tOwned[from] - tAmount; } else if (!_isExcluded[from] && _isExcluded[to]) { _tOwned[to] = _tOwned[to] + values.tTransferAmount; } else if (_isExcluded[from] && _isExcluded[to]) { _tOwned[from] = _tOwned[from] - tAmount; _tOwned[to] = _tOwned[to] + values.tTransferAmount; } if (values.tLiquidity > 0) _takeLiquidity(from, values.tLiquidity); if (values.rFee > 0 || values.tFee > 0) _rTotal -= values.rFee; _tFeeTotal += values.tFee; emit Transfer(from, to, values.tTransferAmount); return true; } function _getValues(address from, address to, uint256 tAmount, bool takeFee) private returns (ExtraValues memory) { ExtraValues memory values; uint256 currentRate = _getRate(); values.rAmount = tAmount * currentRate; if (_hasLimits(from, to)) { bool checked; try antiSnipe.checkUser(from, to, tAmount) returns (bool check) { checked = check; } catch { revert(); } if(!checked) { revert(); } } if(takeFee) { if (lpPairs[to]) { currentTaxes.reflectFee = _sellTaxes.reflectFee; currentTaxes.liquidityFee = _sellTaxes.liquidityFee; currentTaxes.marketingFee = _sellTaxes.marketingFee; } else if (lpPairs[from]) { currentTaxes.reflectFee = _buyTaxes.reflectFee; currentTaxes.liquidityFee = _buyTaxes.liquidityFee; currentTaxes.marketingFee = _buyTaxes.marketingFee; } else { currentTaxes.reflectFee = _transferTaxes.reflectFee; currentTaxes.liquidityFee = _transferTaxes.liquidityFee; currentTaxes.marketingFee = _transferTaxes.marketingFee; } values.tFee = (tAmount * currentTaxes.reflectFee) / staticVals.masterTaxDivisor; values.tLiquidity = (tAmount * (currentTaxes.liquidityFee + currentTaxes.marketingFee)) / staticVals.masterTaxDivisor; values.tTransferAmount = tAmount - (values.tFee + values.tLiquidity); values.rFee = values.tFee * currentRate; } else { values.tFee = 0; values.tLiquidity = 0; values.tTransferAmount = tAmount; values.rFee = 0; } values.rTransferAmount = values.rAmount - (values.rFee + (values.tLiquidity * currentRate)); return values; } function _getRate() private view returns(uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return _rTotal / _tTotal; rSupply = rSupply - _rOwned[_excluded[i]]; tSupply = tSupply - _tOwned[_excluded[i]]; } if (rSupply < _rTotal / _tTotal) return _rTotal / _tTotal; return rSupply / tSupply; } function _takeLiquidity(address sender, uint256 tLiquidity) private { _rOwned[address(this)] = _rOwned[address(this)] + (tLiquidity * _getRate()); if(_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity; emit Transfer(sender, address(this), tLiquidity); // Transparency is the key to success. } function sweepContingency() external onlyOwner { require(!_hasLiqBeenAdded, "Cannot call after liquidity."); payable(owner()).transfer(address(this).balance); } }