Transaction Hash:
Block:
18149703 at Sep-16-2023 03:52:11 PM +UTC
Transaction Fee:
0.000563253943084842 ETH
$1.41
Gas Used:
26,723 Gas / 21.077496654 Gwei
Emitted Events:
226 |
woodpileToken.Approval( owner=[Sender] 0x37c82ff5b4b69b3ba25e27051ba1c3916c918252, spender=0x7a250d56...659F2488D, value=115792089237316195423570985008687907853269984665640564039457584007913129639935 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x37C82Ff5...16C918252 |
0.038241626780127038 Eth
Nonce: 209
|
0.037678372837042196 Eth
Nonce: 210
| 0.000563253943084842 | ||
0xbd3Afb0b...8713C3b01
Miner
| (BuildAI.net) | 0.239478779466899188 Eth | 0.239479046696899188 Eth | 0.00000026723 |
Execution Trace
woodpileToken.approve( spender=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935 ) => ( True )
approve[ERC20 (ln:325)]
_msgSender[ERC20 (ln:326)]
_approve[ERC20 (ln:327)]
Approval[ERC20 (ln:426)]
/** *Submitted for verification at Etherscan.io on 2022-12-19 */ // Welcome to WOODPILE. An automated deflationary token that buys AXE CAP token to claim a portion of the AXE CAP revenue share. // AXE revenue share is then used to buy back and burn WOODPILE. // WOODPILE has 5% buy and 5% sell taxes with the following. // 2% REV SHARE TO WOODPILE HOLDERS IN WETH // 2% WOODPILE BUY BACK AND BURN + TEAM // 1% BUY BACK & INVEST (CURRENT REV SHARE INVEST - AXE) // Hold WOODPILE token to benefit from 2 x delfationary methods + WETH revenue share. // 50% of WOODPILE is already burning. // Track all important information at protocol wallet woodpiles.eth // Find the website at woodpiles.xyz // Telegram @woodpileToken // This protocol can rotate to buy other revenue earning bots and projects. // Token launch scheduled between 13th and 16th of September 2023. Good luck. Rev share live two weeks after launch. // SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, 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 sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IFactory { function createPair(address tokenA, address tokenB) external returns (address pair); function getPair(address tokenA, address tokenB) external view returns (address pair); } interface IRouter { function factory() external pure returns (address); function WETH() 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( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public 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; } } 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; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _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 { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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 {} } contract woodpileToken is Ownable, ERC20 { using Address for address; IRouter public uniswapV2Router; address public immutable uniswapV2Pair; string private constant _name = "Woodpile"; string private constant _symbol = "WOODPILE"; bool public isTradingEnabled; uint256 public initialSupply = 1000000 * (10**18); // max buy and sell tx is 100% of initialSupply uint256 public maxTxAmount = initialSupply; // max wallet is 1% of initialSupply uint256 public maxWalletAmount = initialSupply * 100 / 10000; bool private _swapping; uint256 public minimumTokensBeforeSwap = initialSupply * 1 / 100000; address public revShareWallet; address public investWallet; address public operationsWallet; struct CustomTaxPeriod { bytes23 periodName; uint8 revShareWalletFeeOnBuy; uint8 revShareWalletFeeOnSell; uint8 investWalletFeeOnBuy; uint8 investWalletFeeOnSell; uint8 operationsFeeOnBuy; uint8 operationsFeeOnSell; } // Base taxes CustomTaxPeriod private _base = CustomTaxPeriod("base", 2, 2, 1, 1, 2, 2); bool private _isLaunched; bool public _launchTokensClaimed; uint256 private _launchStartTimestamp; uint256 private _launchBlockNumber; uint256 public launchTokens; mapping (address => bool) private _isBlocked; mapping(address => bool) private _isAllowedToTradeWhenDisabled; mapping(address => bool) private _feeOnSelectedWalletTransfers; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromMaxTransactionLimit; mapping(address => bool) private _isExcludedFromMaxWalletLimit; mapping(address => bool) public automatedMarketMakerPairs; uint8 private _revShareWalletFee; uint8 private _investWalletFee; uint8 private _operationsFee; uint8 private _totalFee; event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value); event BlockedAccountChange(address indexed holder, bool indexed status); event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress); event WalletChange(string indexed indentifier,address indexed newWallet,address indexed oldWallet); event FeeChange(string indexed identifier,uint8 revShareWalletFee,uint8 investWalletFee,uint8 operationsFee); event CustomTaxPeriodChange(uint256 indexed newValue,uint256 indexed oldValue,string indexed taxType,bytes23 period); event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue); event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue); event ExcludeFromFeesChange(address indexed account, bool isExcluded); event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded); event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded); event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded); event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity); event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue); event ClaimOverflow(address token, uint256 amount); event TradingStatusChange(bool indexed newValue, bool indexed oldValue); event FeesApplied(uint8 revShareWalletFee,uint8 investWalletFee,uint8 operationsFee,uint8 totalFee); constructor() ERC20(_name, _symbol) { revShareWallet = owner(); investWallet = owner(); operationsWallet = owner(); IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this),_uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isAllowedToTradeWhenDisabled[owner()] = true; _isAllowedToTradeWhenDisabled[address(this)] = true; _isExcludedFromMaxTransactionLimit[address(this)] = true; _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true; _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true; _isExcludedFromMaxWalletLimit[address(this)] = true; _isExcludedFromMaxWalletLimit[owner()] = true; _mint(owner(), initialSupply); } receive() external payable {} function activateTrading() external onlyOwner { isTradingEnabled = true; if(_launchBlockNumber == 0) { _launchBlockNumber = block.number; _launchStartTimestamp = block.timestamp; _isLaunched = true; } emit TradingStatusChange(true, false); } function deactivateTrading() external onlyOwner { isTradingEnabled = false; emit TradingStatusChange(false, true); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value,"woodpile: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; emit AutomatedMarketMakerPairChange(pair, value); } function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner { _isAllowedToTradeWhenDisabled[account] = allowed; emit AllowedWhenTradingDisabledChange(account, allowed); } function blockAccount(address account) external onlyOwner { require(!_isBlocked[account], "woodpile: Account is already blocked"); if (_isLaunched) { require((block.timestamp - _launchStartTimestamp) < 172800, "woodpile: Time to block accounts has expired"); } _isBlocked[account] = true; emit BlockedAccountChange(account, true); } function unblockAccount(address account) external onlyOwner { require(_isBlocked[account], "woodpile: Account is not blcoked"); _isBlocked[account] = false; emit BlockedAccountChange(account, false); } function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner { require(_feeOnSelectedWalletTransfers[account] != value,"woodpile: The selected wallet is already set to the value "); _feeOnSelectedWalletTransfers[account] = value; emit FeeOnSelectedWalletTransfersChange(account, value); } function excludeFromFees(address account, bool excluded) external onlyOwner { require(_isExcludedFromFee[account] != excluded,"woodpile: Account is already the value of 'excluded'"); _isExcludedFromFee[account] = excluded; emit ExcludeFromFeesChange(account, excluded); } function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner { require(_isExcludedFromMaxTransactionLimit[account] != excluded,"woodpile: Account is already the value of 'excluded'"); _isExcludedFromMaxTransactionLimit[account] = excluded; emit ExcludeFromMaxTransferChange(account, excluded); } function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner { require(_isExcludedFromMaxWalletLimit[account] != excluded,"woodpile: Account is already the value of 'excluded'"); _isExcludedFromMaxWalletLimit[account] = excluded; emit ExcludeFromMaxWalletChange(account, excluded); } function setWallets(address newrevShareWallet,address newinvestWallet,address newOperationsWallet) external onlyOwner { if (revShareWallet != newrevShareWallet) { require(newrevShareWallet != address(0), "woodpile: The revShareWallet cannot be 0"); emit WalletChange("revShareWallet", newrevShareWallet, revShareWallet); revShareWallet = newrevShareWallet; } if (investWallet != newinvestWallet) { require(newinvestWallet != address(0), "woodpile: The investWallet cannot be 0"); emit WalletChange("investWallet", newinvestWallet, investWallet); investWallet = newinvestWallet; } if (operationsWallet != newOperationsWallet) { require(newOperationsWallet != address(0), "woodpile: The operationsWallet cannot be 0"); emit WalletChange("operationsWallet", newOperationsWallet, operationsWallet); operationsWallet = newOperationsWallet; } } // Base fees function setBaseFeesOnBuy(uint8 _revShareWalletFeeOnBuy,uint8 _investWalletFeeOnBuy,uint8 _operationsFeeOnBuy) external onlyOwner { _setCustomBuyTaxPeriod(_base,_revShareWalletFeeOnBuy,_investWalletFeeOnBuy,_operationsFeeOnBuy); emit FeeChange("baseFees-Buy",_revShareWalletFeeOnBuy,_investWalletFeeOnBuy,_operationsFeeOnBuy); } function setBaseFeesOnSell(uint8 _revShareWalletFeeOnSell,uint8 _investWalletFeeOnSell,uint8 _operationsFeeOnSell) external onlyOwner { _setCustomSellTaxPeriod(_base,_revShareWalletFeeOnSell,_investWalletFeeOnSell,_operationsFeeOnSell); emit FeeChange("baseFees-Sell",_revShareWalletFeeOnSell,_investWalletFeeOnSell,_operationsFeeOnSell); } function setUniswapRouter(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Router),"woodpile: The router already has that address"); emit UniswapV2RouterChange(newAddress, address(uniswapV2Router)); uniswapV2Router = IRouter(newAddress); } function setMaxTransactionAmount(uint256 newValue) external onlyOwner { require(newValue != maxTxAmount, "woodpile: Cannot update maxTxAmount to same value"); emit MaxTransactionAmountChange(newValue, maxTxAmount); maxTxAmount = newValue; } function setMaxWalletAmount(uint256 newValue) external onlyOwner { require(newValue != maxWalletAmount,"woodpile: Cannot update maxWalletAmount to same value"); emit MaxWalletAmountChange(newValue, maxWalletAmount); maxWalletAmount = newValue; } function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner { require(newValue != minimumTokensBeforeSwap,"woodpile: Cannot update minimumTokensBeforeSwap to same value"); emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap); minimumTokensBeforeSwap = newValue; } function claimLaunchTokens() external onlyOwner { require(_launchStartTimestamp > 0, "woodpile: Launch must have occurred"); require(!_launchTokensClaimed, "woodpile: Launch tokens have already been claimed"); require(block.number - _launchBlockNumber > 7, "woodpile: Only claim launch tokens after launch"); uint256 tokenBalance = balanceOf(address(this)); _launchTokensClaimed = true; require(launchTokens <= tokenBalance, "woodpile: A swap and liquify has already occurred"); uint256 amount = launchTokens; launchTokens = 0; (bool success) = IERC20(address(this)).transfer(owner(), amount); if (success){ emit ClaimOverflow(address(this), amount); } } function claimETHOverflow(uint256 amount) external onlyOwner { require(amount <= address(this).balance, "woodpile: Cannot send more than contract balance"); (bool success, ) = address(owner()).call{ value: amount }(""); if (success) { emit ClaimOverflow(uniswapV2Router.WETH(), amount); } } // Getters function getBaseBuyFees() external view returns (uint8,uint8,uint8) { return (_base.revShareWalletFeeOnBuy,_base.investWalletFeeOnBuy,_base.operationsFeeOnBuy); } function getBaseSellFees() external view returns (uint8,uint8,uint8) { return (_base.revShareWalletFeeOnSell,_base.investWalletFeeOnSell,_base.operationsFeeOnSell); } // Main 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"); if (amount == 0) { super._transfer(from, to, 0); return; } if (!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) { require(isTradingEnabled, "woodpile: Trading is currently disabled."); require(!_isBlocked[to], "woodpile: Account is blocked"); require(!_isBlocked[from], "woodpile: Account is blocked"); if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) { require(amount <= maxTxAmount, "woodpile: Buy amount exceeds the maxTxBuyAmount."); } if (!_isExcludedFromMaxWalletLimit[to]) { require((balanceOf(to) + amount) <= maxWalletAmount, "woodpile: Expected wallet amount exceeds the maxWalletAmount."); } } _adjustTaxes(automatedMarketMakerPairs[from], automatedMarketMakerPairs[to], from, to); bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap; if ( isTradingEnabled && canSwap && !_swapping && _totalFee > 0 && automatedMarketMakerPairs[to] ) { _swapping = true; _swapAndLiquify(); _swapping = false; } bool takeFee = !_swapping && isTradingEnabled; if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { takeFee = false; } if (takeFee && _totalFee > 0) { uint256 fee = (amount * _totalFee) / 100; amount = amount - fee; if (_launchStartTimestamp > 0 && (block.number - _launchBlockNumber <= 5)) { launchTokens += fee; } super._transfer(from, address(this), fee); } super._transfer(from, to, amount); } function _adjustTaxes(bool isBuyFromLp,bool isSelltoLp,address from,address to) private { _revShareWalletFee = 0; _investWalletFee = 0; _operationsFee = 0; if (isBuyFromLp) { if (_isLaunched && block.timestamp - _launchBlockNumber <= 5) { _revShareWalletFee = 100; } else { _revShareWalletFee = _base.revShareWalletFeeOnBuy; _investWalletFee = _base.investWalletFeeOnBuy; _operationsFee = _base.operationsFeeOnBuy; } } if (isSelltoLp) { _revShareWalletFee = _base.revShareWalletFeeOnSell; _investWalletFee = _base.investWalletFeeOnSell; _operationsFee = _base.operationsFeeOnSell; } if (!isSelltoLp && !isBuyFromLp && (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])) { _revShareWalletFee = _base.revShareWalletFeeOnBuy; _investWalletFee = _base.investWalletFeeOnBuy; _operationsFee = _base.operationsFeeOnBuy; } _totalFee = _revShareWalletFee + _investWalletFee + _operationsFee; emit FeesApplied(_revShareWalletFee, _investWalletFee, _operationsFee, _totalFee); } function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,uint8 _revShareWalletFeeOnSell,uint8 _investWalletFeeOnSell,uint8 _operationsFeeOnSell) private { if (map.revShareWalletFeeOnSell != _revShareWalletFeeOnSell) { emit CustomTaxPeriodChange(_revShareWalletFeeOnSell,map.revShareWalletFeeOnSell,"revShareWalletFeeOnSell",map.periodName); map.revShareWalletFeeOnSell = _revShareWalletFeeOnSell; } if (map.investWalletFeeOnSell != _investWalletFeeOnSell) { emit CustomTaxPeriodChange(_investWalletFeeOnSell,map.investWalletFeeOnSell,"investWalletFeeOnSell",map.periodName); map.investWalletFeeOnSell = _investWalletFeeOnSell; } if (map.operationsFeeOnSell != _operationsFeeOnSell) { emit CustomTaxPeriodChange(_operationsFeeOnSell,map.operationsFeeOnSell,"operationsFeeOnSell",map.periodName); map.operationsFeeOnSell = _operationsFeeOnSell; } } function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,uint8 _revShareWalletFeeOnBuy,uint8 _investWalletFeeOnBuy,uint8 _operationsFeeOnBuy) private { if (map.revShareWalletFeeOnBuy != _revShareWalletFeeOnBuy) { emit CustomTaxPeriodChange(_revShareWalletFeeOnBuy,map.revShareWalletFeeOnBuy,"revShareWalletFeeOnBuy",map.periodName); map.revShareWalletFeeOnBuy = _revShareWalletFeeOnBuy; } if (map.investWalletFeeOnBuy != _investWalletFeeOnBuy) { emit CustomTaxPeriodChange(_investWalletFeeOnBuy,map.investWalletFeeOnBuy,"investWalletFeeOnBuy",map.periodName); map.investWalletFeeOnBuy = _investWalletFeeOnBuy; } if (map.operationsFeeOnBuy != _operationsFeeOnBuy) { emit CustomTaxPeriodChange(_operationsFeeOnBuy,map.operationsFeeOnBuy,"operationsFeeOnBuy",map.periodName); map.operationsFeeOnBuy = _operationsFeeOnBuy; } } function _swapAndLiquify() private { uint256 contractBalance = balanceOf(address(this)); uint256 initialETHBalance = address(this).balance; uint256 amountToLiquify = (contractBalance * _revShareWalletFee) / _totalFee / 2; uint256 amountToSwap = contractBalance - amountToLiquify; _swapTokensForETH(amountToSwap); uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance; uint256 totalETHFee = _totalFee - (_revShareWalletFee / 2); uint256 amountETHrevShareWallet = (ETHBalanceAfterSwap * _revShareWalletFee) / totalETHFee / 2; uint256 amountETHinvestWallet = (ETHBalanceAfterSwap * _investWalletFee) / totalETHFee; uint256 amountETHOperations = ETHBalanceAfterSwap - (amountETHrevShareWallet + amountETHinvestWallet); Address.sendValue(payable(operationsWallet),amountETHOperations); Address.sendValue(payable(investWallet),amountETHinvestWallet); if (amountToLiquify > 0) { _addLiquidity(amountToLiquify, amountETHrevShareWallet); emit SwapAndLiquify(amountToSwap, amountETHrevShareWallet, amountToLiquify); } } 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, 1, // accept any amount of ETH path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{ value: ethAmount }( address(this), tokenAmount, 1, // slippage is unavoidable 1, // slippage is unavoidable revShareWallet, block.timestamp ); } }