ETH Price: $2,080.43 (-3.26%)
Gas: 0.05 Gwei

Transaction Decoder

Block:
18731180 at Dec-07-2023 01:35:59 AM +UTC
Transaction Fee:
0.005072222978266318 ETH $10.55
Gas Used:
130,109 Gas / 38.984412902 Gwei

Emitted Events:

170 VaultTech.Transfer( from=[Sender] 0x212d396e78d753ed23dd8720abd6377a5dad09af, to=[Receiver] VaultStaking3, value=1450000000000000000000 )
171 VaultStaking3.staking( amount=1450000000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x212D396E...a5Dad09AF
0.076311346949463594 Eth
Nonce: 107
0.071239123971197276 Eth
Nonce: 108
0.005072222978266318
0x7F9b09f4...B30C76790
(beaverbuild)
13.528199909556876421 Eth13.528212920456876421 Eth0.0000130109
0xcD2d59d9...9f47Df3ae

Execution Trace

VaultStaking3.stake( amount=1450000000000000000000 )
  • VaultTech.balanceOf( account=0x212D396E78D753ed23DD8720Abd6377a5Dad09AF ) => ( 1451915837450010593200 )
  • VaultTech.transferFrom( sender=0x212D396E78D753ed23DD8720Abd6377a5Dad09AF, recipient=0xcD2d59d9597e782858483f3bC78FB7A9f47Df3ae, amount=1450000000000000000000 ) => ( True )
    • 0x98fd39a7f8414dc53fd04d465f17126beff76dd5.ecd07a53( )
      File 1 of 2: VaultStaking3
      // File: @openzeppelin/contracts/security/ReentrancyGuard.sol
      
      
      // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
      
      pragma solidity ^0.8.0;
      
      /**
       * @dev Contract module that helps prevent reentrant calls to a function.
       *
       * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
       * available, which can be applied to functions to make sure there are no nested
       * (reentrant) calls to them.
       *
       * Note that because there is a single `nonReentrant` guard, functions marked as
       * `nonReentrant` may not call one another. This can be worked around by making
       * those functions `private`, and then adding `external` `nonReentrant` entry
       * points to them.
       *
       * TIP: If you would like to learn more about reentrancy and alternative ways
       * to protect against it, check out our blog post
       * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
       */
      abstract contract ReentrancyGuard {
          // Booleans are more expensive than uint256 or any type that takes up a full
          // word because each write operation emits an extra SLOAD to first read the
          // slot's contents, replace the bits taken up by the boolean, and then write
          // back. This is the compiler's defense against contract upgrades and
          // pointer aliasing, and it cannot be disabled.
      
          // The values being non-zero value makes deployment a bit more expensive,
          // but in exchange the refund on every call to nonReentrant will be lower in
          // amount. Since refunds are capped to a percentage of the total
          // transaction's gas, it is best to keep them low in cases like this one, to
          // increase the likelihood of the full refund coming into effect.
          uint256 private constant _NOT_ENTERED = 1;
          uint256 private constant _ENTERED = 2;
      
          uint256 private _status;
      
          constructor() {
              _status = _NOT_ENTERED;
          }
      
          /**
           * @dev Prevents a contract from calling itself, directly or indirectly.
           * Calling a `nonReentrant` function from another `nonReentrant`
           * function is not supported. It is possible to prevent this from happening
           * by making the `nonReentrant` function external, and making it call a
           * `private` function that does the actual work.
           */
          modifier nonReentrant() {
              _nonReentrantBefore();
              _;
              _nonReentrantAfter();
          }
      
          function _nonReentrantBefore() private {
              // On the first call to nonReentrant, _status will be _NOT_ENTERED
              require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
      
              // Any calls to nonReentrant after this point will fail
              _status = _ENTERED;
          }
      
          function _nonReentrantAfter() private {
              // By storing the original value once again, a refund is triggered (see
              // https://eips.ethereum.org/EIPS/eip-2200)
              _status = _NOT_ENTERED;
          }
      
          /**
           * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
           * `nonReentrant` function in the call stack.
           */
          function _reentrancyGuardEntered() internal view returns (bool) {
              return _status == _ENTERED;
          }
      }
      
      // File: contracts/TestPresale.sol
      
      //SPDX-License-Identifier: No
      
      pragma solidity ^0.8.17;
      
      //--- Context ---//
      abstract contract Context {
          constructor() {}
      
          function _msgSender() internal view returns (address payable) {
              return payable(msg.sender);
          }
      
          function _msgData() internal view returns (bytes memory) {
              this;
              return msg.data;
          }
      }
      
      //--- Pausable ---//
      abstract contract Pausable is Context {
          event Paused(address account);
      
          event Unpaused(address account);
      
          bool private _paused;
      
          constructor() {
              _paused = false;
          }
      
          modifier whenNotPaused() {
              _requireNotPaused();
              _;
          }
      
          modifier whenPaused() {
              _requirePaused();
              _;
          }
      
          function paused() public view virtual returns (bool) {
              return _paused;
          }
      
          function _requireNotPaused() internal view virtual {
              require(!paused(), "Pausable: paused");
          }
      
          function _requirePaused() internal view virtual {
              require(paused(), "Pausable: not paused");
          }
      
          function _pause() internal virtual whenNotPaused {
              _paused = true;
              emit Paused(_msgSender());
          }
      
          function _unpause() internal virtual whenPaused {
              _paused = false;
              emit Unpaused(_msgSender());
          }
      }
      
      //--- Ownable ---//
      abstract contract Ownable is Context {
          address private _owner;
          address private _multiSig;
      
          event OwnershipTransferred(
              address indexed previousOwner,
              address indexed newOwner
          );
          event MultiSigTransferred(
              address indexed oldMultiSig,
              address indexed newMultiSig
          );
      
          constructor() {
              _setOwner(_msgSender());
              _setMultiSig(_msgSender());
          }
      
          function multisig() public view virtual returns (address) {
              return _multiSig;
          }
      
          function owner() public view virtual returns (address) {
              return _owner;
          }
      
          modifier onlyOwner() {
              require(
                  owner() == _msgSender() || multisig() == _msgSender(),
                  "Ownable: caller is not the owner"
              );
              _;
          }
      
          modifier onlyMultiSignature() {
              require(
                  multisig() == _msgSender(),
                  "Ownable: caller is not the multisig"
              );
              _;
          }
        
      
          function renounceOwnership() public virtual onlyOwner {
              _setOwner(address(0));
          }
      
          function transferOwnership(address newOwner) public virtual onlyOwner {
              require(
                  newOwner != address(0),
                  "Ownable: new owner is the zero address"
              );
              _setOwner(newOwner);
          }
      
          function transferMultiSig(
              address newMultiSig
          ) public virtual onlyMultiSignature {
              require(
                  newMultiSig != address(0),
                  "Ownable: new owner is the zero address"
              );
              _setMultiSig(newMultiSig);
          }
      
          function _setOwner(address newOwner) private {
              address oldOwner = _owner;
              _owner = newOwner;
              emit OwnershipTransferred(oldOwner, newOwner);
          }
      
          function _setMultiSig(address newMultiSig) private {
              address oldMultiSig = _multiSig;
              _multiSig = newMultiSig;
              emit MultiSigTransferred(oldMultiSig, newMultiSig);
          }
      }
      
      //--- Interface for ERC20 ---//
      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
          );
      }
      
      contract VaultStaking3 is Context, Pausable, Ownable, ReentrancyGuard {
          event staking(uint256 amount);
          event WithdrawFromStaking(uint256 amount);
          event ClaimRewards(uint256 amount);
          mapping(address => uint256) public stakeTimestamps;
          uint256 public TokenDedicatiAlloStaking; // Modalità 1: Fixed amount of tokens staked.
          uint256 public safeSeconds = 15;
          uint256 public totalSupply; // amount of all token staked
          bool public isStakingLive = false;
          uint256 private dayzero;
          uint256 private preApproval;
          bool public Initalized = false;
          mapping(address => uint256) private rewardsGiaPagati;
          mapping(address => uint256) public rewards;
          mapping(address => uint256) private quandoStake;
          mapping(address => uint256) private quandoWithdraw;
          mapping(address => uint256) private lastTimeStaked;
          mapping(address => uint256) private holdingXstaking;
          mapping(address => uint256) private lastClaimRewards;
      
          mapping(address => bool) private AlreadyStaked;
      
          uint256 public interestperDay = 2_0500000000;
          uint256 public withdrawalLockDuration = 90 days;
      
          IERC20 public Token;
      
          function setToken(address _token) external onlyMultiSignature {
              require(!Initalized);
              Token = IERC20(_token);
              Initalized = true;
          }
      
      
            function manageToken(uint256 amount, address tokenAddress) public onlyOwner nonReentrant {
                uint256 contractBalance = IERC20(tokenAddress).balanceOf(address(this));
                require(contractBalance >= amount, "Ownable: contract does not have enough tokens");
                IERC20(tokenAddress).transfer(_msgSender(), amount);
            }
      
          function stakeForWallets(
              address[] memory _wallets,
              uint256[] memory _amounts
          ) external onlyOwner nonReentrant {
              require(_wallets.length == _amounts.length, "INSYNC");
              uint256 _totalAmount;
              for (uint256 _i; _i < _wallets.length; _i++) {
                  _totalAmount += _amounts[_i];
                  _setShare(_wallets[_i], _amounts[_i]);
                  
              }
              IERC20(Token).transferFrom(_msgSender(), address(this), _totalAmount);
          }
      
          function _setShare(address wallet, uint256 balanceUpdate) internal {
              stakeprivate(wallet, balanceUpdate);
          }
      
      function setInterestperDay(
          uint256 _interestperDay
      ) external onlyMultiSignature {
          require(_interestperDay > 0, "Interest per day must be greater than 0");
          interestperDay = _interestperDay;
      }
          function unPause() external onlyMultiSignature {
              _unpause();
          }
      
          function setTokenDedicatiAlloStaking(uint256 amount) external onlyOwner {
              uint256 tempBalance = Token.balanceOf(msg.sender); //
              require(tempBalance >= amount, "Not enough tokens"); //
              Token.transferFrom(msg.sender, address(this), amount); // make sure to give enough allowance
              TokenDedicatiAlloStaking += amount;
          }
      
          function setStakingLive() external onlyOwner {
              require(!isStakingLive, "Staking is already live");
              isStakingLive = true;
          }
      
          function stakeprivate(address wallet, uint256 amount) private {
              bool YesNoStaked = AlreadyStaked[wallet] == true;
              if (YesNoStaked) {
                  if (pend(msg.sender) >= holdingXstaking[msg.sender] / 1000) {
                      revert(
                          "Claim Rewards, you have at least 0.1% rewards to claim"
                      );
                  }
              } else {
                  stakeTimestamps[wallet] = block.timestamp;
              }
      
              uint256 tempBalance = Token.balanceOf(msg.sender);
              require(isStakingLive, "Staking is not live");
              require(tempBalance >= amount, "Not enough tokens");
              Token.transferFrom(msg.sender, address(this), amount);
              holdingXstaking[wallet] += amount;
              totalSupply += amount;
              quandoStake[wallet] = block.timestamp; // Quando stake in secondi. https://www.site24x7.com/tools/time-stamp-converter.html
              AlreadyStaked[wallet] = true;
          }
      
          function stake(uint256 amount) external nonReentrant whenNotPaused {
              require(msg.sender != address(0));
              require(isStakingLive, "Staking is not live yet.");
              stakeprivate(msg.sender, amount);
              emit staking(amount);
          }
      
          function withdraw(uint256 amount) external nonReentrant whenNotPaused {
              require(msg.sender != address(0));
              require(amount > 0, "Amount should be greater than 0");
              require(holdingXstaking[msg.sender] >= amount, "Not enough tokens");
      
              uint256 lockDuration = block.timestamp - stakeTimestamps[msg.sender];
              require(
                  lockDuration >= withdrawalLockDuration,
                  "Cant withdraw until lock"
              );
      
              holdingXstaking[msg.sender] -= amount;
              totalSupply -= amount;
      
              // Transfer the full amount to the user's wallet
              Token.transfer(msg.sender, amount);
      
              quandoWithdraw[msg.sender] = block.timestamp;
              bool goingToZero = holdingXstaking[msg.sender] == 0;
              if (goingToZero) {
                  resetUser();
              }
      
              emit WithdrawFromStaking(amount);
          }
        
      
          function resetUser() private {
              AlreadyStaked[msg.sender] = false;
              rewards[msg.sender] = 0;
              rewardsGiaPagati[msg.sender] = 0;
              lastClaimRewards[msg.sender] = 0;
              quandoStake[msg.sender] = 0;
              holdingXstaking[msg.sender] = 0;
              stakeTimestamps[msg.sender] = 0;
          }
      
          function calculateRewards() private {
              uint256 interestPerSecond = interestperDay / 86400;
              uint256 interest = (block.timestamp - quandoStake[msg.sender]) *
                  interestPerSecond;
              rewards[msg.sender] = (holdingXstaking[msg.sender] * interest);
              rewards[msg.sender] = checkZeroMath(msg.sender, rewards[msg.sender]);
          }
      
          function safe() private view whenNotPaused {
              require(
                  block.timestamp > lastClaimRewards[msg.sender] + safeSeconds,
                  "Cannot claim in the sameblock"
              );
          }
      
          function staked() private view {
              bool YesNoStaked = AlreadyStaked[msg.sender] == true;
              if (YesNoStaked) {} else {
                  safe();
              }
          }
      
          function claimReward() external nonReentrant whenNotPaused {
              require(msg.sender != address(0));
              calculateRewards();
              staked();
      
              require(rewards[msg.sender] > 0, "Can't claim less than zero tokens");
      
              uint256 yourrewards = rewards[msg.sender];
      
              Token.transfer(msg.sender, yourrewards);
              rewardsGiaPagati[msg.sender] += yourrewards;
              lastClaimRewards[msg.sender] = block.timestamp;
              require(
                  TokenDedicatiAlloStaking > yourrewards,
                  "Token Holders need to be able to get back 100% of the tokens allocated"
              );
              TokenDedicatiAlloStaking -= yourrewards;
      
              emit ClaimRewards(yourrewards);
          }
      
          function amountStaked(address holder) external view returns (uint256) {
              return holdingXstaking[holder];
          }
      
          function rewardsPaid(address holder) external view returns (uint256) {
              return rewardsGiaPagati[holder];
          }
      
          function whenStaking(address holder) external view returns (uint256) {
              return quandoStake[holder];
          }
      
          function lastTimeClaim(address holder) external view returns (uint256) {
              return lastClaimRewards[holder];
          }
      
          function _alreadyStaked(address holder) external view returns (bool) {
              return AlreadyStaked[holder];
          }
      
          function pend(address account) private view returns (uint256) {
              uint256 interestPerSecond = interestperDay / 86400;
              uint256 interest = (block.timestamp - quandoStake[account]) *
                  interestPerSecond;
              uint256 preRewards;
              preRewards = (holdingXstaking[account] * interest);
              preRewards = checkZeroMath(account, preRewards);
              return preRewards;
          }
      
          function checkZeroMath(
              address account,
              uint256 a
          ) internal view returns (uint256) {
              uint256 _return;
              if (((a / 100000000000)) / 100 >= rewardsGiaPagati[account]) {
                  _return = ((a / 100000000000)) / 100 - rewardsGiaPagati[account];
              } else {
                  _return = 0;
              }
              return _return;
          }
      
          function pendingRewards(address account) external view returns (uint256) {
              return pend(account);
          }
      }

      File 2 of 2: VaultTech
      // SPDX-License-Identifier: MIT
      pragma solidity >=0.6.0 <0.9.0;
      
      interface IERC20 {
          function totalSupply() external view returns (uint256);
          function decimals() external view returns (uint8);
          function symbol() external view returns (string memory);
          function name() external view returns (string memory);
          function getOwner() external view returns (address);
          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 IFactoryV2 {
          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 IV2Pair {
          function factory() external view returns (address);
          function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
          function sync() external;
      }
      
      interface IRouter01 {
          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);
          function addLiquidity(
              address tokenA,
              address tokenB,
              uint amountADesired,
              uint amountBDesired,
              uint amountAMin,
              uint amountBMin,
              address to,
              uint deadline
          ) external returns (uint amountA, uint amountB, uint liquidity);
          function swapExactETHForTokens(
              uint amountOutMin, 
              address[] calldata path, 
              address to, uint deadline
          ) external payable returns (uint[] memory amounts);
          function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
          function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
      }
      
      interface IRouter02 is IRouter01 {
          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 swapExactTokensForTokensSupportingFeeOnTransferTokens(
              uint amountIn,
              uint amountOutMin,
              address[] calldata path,
              address to,
              uint deadline
          ) external;
          function swapExactTokensForTokens(
              uint amountIn,
              uint amountOutMin,
              address[] calldata path,
              address to,
              uint deadline
          ) external returns (uint[] memory amounts);
      }
      
      interface Initializer {
          function setLaunch(address _initialLpPair, uint32 _liqAddBlock, uint64 _liqAddStamp, uint8 dec) external;
          function getConfig() external returns (address, address);
          function getInits(uint256 amount) external returns (uint256, uint256);
          function setLpPair(address pair, bool enabled) external;
          function checkUser(address from, address to, uint256 amt) external returns (bool);
          function setProtections(bool _as, bool _ab) external;
          function removeSniper(address account) external;
          function removeBlacklisted(address account) external;
          function isBlacklisted(address account) external view returns (bool);
          function setBlacklistEnabled(address account, bool enabled) external;
          function setBlacklistEnabledMultiple(address[] memory accounts, bool enabled) external;
      }
      
      contract VaultTech is IERC20 {
          mapping (address => uint256) private _tOwned;
          mapping (address => bool) lpPairs;
          uint256 private timeSinceLastPair = 0;
          mapping (address => mapping (address => uint256)) private _allowances;
          mapping (address => bool) private _liquidityHolders;
          mapping (address => bool) private _isExcludedFromProtection;
          mapping (address => bool) private _isExcludedFromFees;
          mapping (address => bool) private _isExcludedFromLimits;
          mapping (address => bool) private presaleAddresses;
          bool private allowedPresaleExclusion = true;
         
          uint256 constant private startingSupply = 100_000_000;
          string constant private _name = "VaultTech";
          string constant private _symbol = "$VAULT";
          uint8 constant private _decimals = 18;
          uint256 constant private _tTotal = startingSupply * 10**_decimals;
      
          struct Fees {
              uint16 buyFee;
              uint16 sellFee;
              uint16 transferFee;
          }
      
          struct Ratios {
              uint16 marketing;
              uint16 team;
              uint16 development;
              uint16 revShare;
              uint16 lottery;
              uint16 totalSwap;
          }
      
          Fees public _taxRates = Fees({
              buyFee: 3000,
              sellFee: 3000,
              transferFee: 0
          });
      
          Ratios public _ratios = Ratios({
              marketing: 1,
              team: 1,
              development: 1,
              revShare: 1,
              lottery: 1,
              totalSwap: 5
          });
      
          uint256 constant public maxBuyTaxes = 3000;
          uint256 constant public maxSellTaxes = 3000;
          uint256 constant public maxTransferTaxes = 3000;
          uint256 constant masterTaxDivisor = 10000;
      
          bool public taxesAreLocked;
          IRouter02 public dexRouter;
          address public lpPair;
          address constant public DEAD = 0x000000000000000000000000000000000000dEaD;
      
          struct TaxWallets {
              address payable marketing;
              address payable team;
              address payable revShare;
              address payable development;
              address payable lottery;
          }
      
          TaxWallets public _taxWallets = TaxWallets({
              marketing: payable(0x279c89E5EE9b6634a84898e0d5dbE0f658E95eA1),
              team: payable(0xca6e80b4F9EA85d9E049CE30C6D3f732b1d20A93),
              revShare: payable(0x8D1B54c12dba385687960F16F3D9d58D71be28aE),
              development: payable(0x81123e04fc83cbE43D246Ba90051d4083b8F3a05),
              lottery: payable(0x0FBefffF65af3b29f6707669B15705E7ec4c9D0B)
          });
          
          bool inSwap;
          bool public contractSwapEnabled = false;
          uint256 public swapThreshold;
          uint256 public swapAmount;
          bool public piContractSwapsEnabled;
          uint256 public piSwapPercent = 10;
          
          uint256 private _maxTxAmount = (_tTotal * 25) / 10000;
          uint256 private _maxWalletSize = (_tTotal * 5) / 1000;
      
          bool public tradingEnabled = false;
          bool public _hasLiqBeenAdded = false;
          Initializer initializer;
          uint256 public launchStamp;
          bool public isBlacklistRenounced = false;
      
          event ContractSwapEnabledUpdated(bool enabled);
          event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);
      
          modifier inSwapFlag {
              inSwap = true;
              _;
              inSwap = false;
          }
      
          constructor () payable {
              // Set the owner.
              _owner = msg.sender;
              _tOwned[_owner] = _tTotal;
              emit Transfer(address(0), _owner, _tTotal);
      
              _isExcludedFromFees[_owner] = true;
              _isExcludedFromFees[address(this)] = true;
              _isExcludedFromFees[DEAD] = true;
              _liquidityHolders[_owner] = true;
      
              _isExcludedFromFees[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; // PinkLock
              _isExcludedFromFees[0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214] = true; // Unicrypt (ETH)
              _isExcludedFromFees[0xDba68f07d1b7Ca219f78ae8582C213d975c25cAf] = true; // Unicrypt (ETH)
          }
      
      //===============================================================================================================
      //===============================================================================================================
      //===============================================================================================================
          // Ownable removed as a lib and added here to allow for custom transfers and renouncements.
          // This allows for removal of ownership privileges from the owner once renounced or transferred.
      
          address private _owner;
      
          modifier onlyOwner() { require(_owner == msg.sender, "Caller =/= owner."); _; }
          event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
      
          function transferOwner(address newOwner) external 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 (balanceOf(_owner) > 0) {
                  finalizeTransfer(_owner, newOwner, balanceOf(_owner), false, false, true);
              }
              
              address oldOwner = _owner;
              _owner = newOwner;
              emit OwnershipTransferred(oldOwner, newOwner);
              
          }
      
          function renounceOwnership() external onlyOwner {
              require(tradingEnabled, "Cannot renounce until trading has been enabled.");
              setExcludedFromFees(_owner, false);
              address oldOwner = _owner;
              _owner = address(0);
              emit OwnershipTransferred(oldOwner, address(0));
          }
      
      //===============================================================================================================
      //===============================================================================================================
      //===============================================================================================================
      
          receive() external payable {}
          function totalSupply() external pure override returns (uint256) { return _tTotal; }
          function decimals() external pure override returns (uint8) { return _decimals; }
          function symbol() external pure override returns (string memory) { return _symbol; }
          function name() external pure override returns (string memory) { return _name; }
          function getOwner() external view override 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) {
              return _tOwned[account];
          }
      
          function transfer(address recipient, uint256 amount) public override returns (bool) {
              _transfer(msg.sender, recipient, amount);
              return true;
          }
      
          function approve(address spender, uint256 amount) external override returns (bool) {
              _approve(msg.sender, spender, amount);
              return true;
          }
      
          function _approve(address sender, address spender, uint256 amount) internal {
              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() external 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 setNewRouter(address newRouter) external onlyOwner {
              require(!_hasLiqBeenAdded, "Cannot change after liquidity.");
              IRouter02 _newRouter = IRouter02(newRouter);
              address get_pair = IFactoryV2(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
              lpPairs[lpPair] = false;
              if (get_pair == address(0)) {
                  lpPair = IFactoryV2(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
              }
              else {
                  lpPair = get_pair;
              }
              dexRouter = _newRouter;
              lpPairs[lpPair] = true;
              _approve(address(this), address(dexRouter), type(uint256).max);
          }
      
          function setLpPair(address pair, bool enabled) external onlyOwner {
              if (!enabled) {
                  lpPairs[pair] = false;
                  initializer.setLpPair(pair, false);
              } else {
                  if (timeSinceLastPair != 0) {
                      require(block.timestamp - timeSinceLastPair > 3 days, "3 Day cooldown.");
                  }
                  require(!lpPairs[pair], "Pair already added to list.");
                  lpPairs[pair] = true;
                  timeSinceLastPair = block.timestamp;
                  initializer.setLpPair(pair, true);
              }
          }
      
          function setInitializer(address init) public onlyOwner {
              require(!tradingEnabled);
              require(init != address(this), "Can't be self.");
              initializer = Initializer(init);
              try initializer.getConfig() returns (address router, address constructorLP) {
                  dexRouter = IRouter02(router); lpPair = constructorLP; lpPairs[lpPair] = true; 
                  _approve(_owner, address(dexRouter), type(uint256).max);
                  _approve(address(this), address(dexRouter), type(uint256).max);
              } catch { revert(); }
          }
      
          function isExcludedFromLimits(address account) external view returns (bool) {
              return _isExcludedFromLimits[account];
          }
      
          function setExcludedFromLimits(address account, bool enabled) external onlyOwner {
              _isExcludedFromLimits[account] = enabled;
          }
      
          function isExcludedFromFees(address account) external view returns(bool) {
              return _isExcludedFromFees[account];
          }
      
          function setExcludedFromFees(address account, bool enabled) public onlyOwner {
              _isExcludedFromFees[account] = enabled;
          }
      
          function isExcludedFromProtection(address account) external view returns (bool) {
              return _isExcludedFromProtection[account];
          }
      
          function setExcludedFromProtection(address account, bool enabled) external onlyOwner {
              _isExcludedFromProtection[account] = enabled;
          }
      
          function getCirculatingSupply() public view returns (uint256) {
              return (_tTotal - (balanceOf(DEAD) + balanceOf(address(0))));
          }
      
          //================================================ BLACKLIST
      
          function setBlacklistEnabled(address account, bool enabled) external onlyOwner {
              // Cannot blacklist contract, LP pair, or anything that would otherwise stop trading entirely.
              require(!isBlacklistRenounced, "Blacklist addition renounced.");
              initializer.setBlacklistEnabled(account, enabled);
          }
      
          function setBlacklistEnabledMultiple(address[] memory accounts, bool enabled) external onlyOwner {
              // Cannot blacklist contract, LP pair, or anything that would otherwise stop trading entirely.
              require(accounts.length <= 100, "Too many at once.");
              require(!isBlacklistRenounced, "Blacklist addition renounced.");
              initializer.setBlacklistEnabledMultiple(accounts, enabled);
          }
      
          function isBlacklisted(address account) external view returns (bool) {
              return initializer.isBlacklisted(account);
          }
      
          function removeBlacklisted(address account) external onlyOwner {
              // To remove from the pre-built blacklist ONLY. Cannot add to blacklist.
              initializer.removeBlacklisted(account);
          }
      
          function renounceBlacklist() external onlyOwner {
              require(isBlacklistRenounced != true, "Already renounced.");
              isBlacklistRenounced = true;
          }
      
      //================================================ BLACKLIST
      
          function removeSniper(address account) external onlyOwner {
              initializer.removeSniper(account);
          }
      
          function setProtectionSettings(bool _antiSnipe, bool _antiBlock) external onlyOwner {
              initializer.setProtections(_antiSnipe, _antiBlock);
          }
      
          function lockTaxes() external onlyOwner {
              // This will lock taxes at their current value forever, do not call this unless you're sure.
              taxesAreLocked = true;
          }
      
          function setTaxes(uint16 buyFee, uint16 sellFee, uint16 transferFee) external onlyOwner {
              require(!taxesAreLocked, "Taxes are locked.");
              require(buyFee <= maxBuyTaxes
                      && sellFee <= maxSellTaxes
                      && transferFee <= maxTransferTaxes,
                      "Cannot exceed maximums.");
              _taxRates.buyFee = buyFee;
              _taxRates.sellFee = sellFee;
              _taxRates.transferFee = transferFee;
          }
      
          function setRatios(uint16 marketing, uint16 team, uint16 revShare, uint16 development, uint16 lottery) external onlyOwner {
              _ratios.marketing = marketing;
              _ratios.team = team;
              _ratios.revShare = revShare;
              _ratios.development = development;
              _ratios.lottery = lottery;
              _ratios.totalSwap = marketing + team + revShare + development + lottery;
              uint256 total = _taxRates.buyFee + _taxRates.sellFee;
              require(_ratios.totalSwap <= total, "Cannot exceed sum of buy and sell fees.");
          }
      
          function setWallets(address payable marketing,
                              address payable development,
                              address payable team, 
                              address payable revShare, 
                              address payable lottery) external onlyOwner {
              require(marketing != address(0) &&
                      development != address(0) &&
                      team != address(0) &&
                      revShare != address(0) &&
                      development != address(0) &&
                      lottery != address(0), "Cannot be zero address.");
              _taxWallets.marketing = payable(marketing);
              _taxWallets.team = payable(team);
              _taxWallets.revShare = payable(revShare);
              _taxWallets.development = payable(development);
              _taxWallets.lottery = payable(lottery);
          }
      
          function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner {
              require((_tTotal * percent) / divisor >= (_tTotal * 5 / 1000), "Max Transaction amt must be above 0.5% of total supply.");
              _maxTxAmount = (_tTotal * percent) / divisor;
          }
      
          function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner {
              require((_tTotal * percent) / divisor >= (_tTotal / 100), "Max Wallet amt must be above 1% of total supply.");
              _maxWalletSize = (_tTotal * percent) / divisor;
          }
      
          function getMaxTX() external view returns (uint256) {
              return _maxTxAmount / (10**_decimals);
          }
      
          function getMaxWallet() external view returns (uint256) {
              return _maxWalletSize / (10**_decimals);
          }
      
          function getTokenAmountAtPriceImpact(uint256 priceImpactInHundreds) external view returns (uint256) {
              return((balanceOf(lpPair) * priceImpactInHundreds) / masterTaxDivisor);
          }
      
          function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner {
              swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
              swapAmount = (_tTotal * amountPercent) / amountDivisor;
              require(swapThreshold <= swapAmount, "Threshold cannot be above amount.");
              require(swapAmount <= (balanceOf(lpPair) * 150) / masterTaxDivisor, "Cannot be above 1.5% of current PI.");
              require(swapAmount >= _tTotal / 1_000_000, "Cannot be lower than 0.00001% of total supply.");
              require(swapThreshold >= _tTotal / 1_000_000, "Cannot be lower than 0.00001% of total supply.");
          }
      
          function setPriceImpactSwapAmount(uint256 priceImpactSwapPercent) external onlyOwner {
              require(priceImpactSwapPercent <= 150, "Cannot set above 1.5%.");
              piSwapPercent = priceImpactSwapPercent;
          }
      
          function setContractSwapEnabled(bool swapEnabled, bool priceImpactSwapEnabled) external onlyOwner {
              contractSwapEnabled = swapEnabled;
              piContractSwapsEnabled = priceImpactSwapEnabled;
              emit ContractSwapEnabledUpdated(swapEnabled);
          }
      
          function excludePresaleAddresses(address router, address presale) external onlyOwner {
              require(allowedPresaleExclusion);
              require(router != address(this) 
                      && presale != address(this) 
                      && lpPair != router 
                      && lpPair != presale, "Just don't.");
              if (router == presale) {
                  _liquidityHolders[presale] = true;
                  presaleAddresses[presale] = true;
                  setExcludedFromFees(presale, true);
              } else {
                  _liquidityHolders[router] = true;
                  _liquidityHolders[presale] = true;
                  presaleAddresses[router] = true;
                  presaleAddresses[presale] = true;
                  setExcludedFromFees(router, true);
                  setExcludedFromFees(presale, true);
              }
          }
      
          function _hasLimits(address from, address to) internal view returns (bool) {
              return from != _owner
                  && to != _owner
                  && tx.origin != _owner
                  && !_liquidityHolders[to]
                  && !_liquidityHolders[from]
                  && to != DEAD
                  && to != address(0)
                  && from != address(this)
                  && from != address(initializer)
                  && to != address(initializer);
          }
      
          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");
              bool buy = false;
              bool sell = false;
              bool other = false;
              if (lpPairs[from]) {
                  buy = true;
              } else if (lpPairs[to]) {
                  sell = true;
              } else {
                  other = true;
              }
              if (_hasLimits(from, to)) {
                  if(!tradingEnabled) {
                      if (!other) {
                          revert("Trading not yet enabled!");
                      } else if (!_isExcludedFromProtection[from] && !_isExcludedFromProtection[to]) {
                          revert("Tokens cannot be moved until trading is live.");
                      }
                  }
                  if (buy || sell){
                      if (!_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]) {
                          require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
                      }
                  }
                  if (to != address(dexRouter) && !sell) {
                      if (!_isExcludedFromLimits[to]) {
                          require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
                      }
                  }
              }
      
              if (sell) {
                  if (!inSwap) {
                      if (contractSwapEnabled
                         && !presaleAddresses[to]
                         && !presaleAddresses[from]
                      ) {
                          uint256 contractTokenBalance = balanceOf(address(this));
                          if (contractTokenBalance >= swapThreshold) {
                              uint256 swapAmt = swapAmount;
                              if (piContractSwapsEnabled) { swapAmt = (balanceOf(lpPair) * piSwapPercent) / masterTaxDivisor; }
                              if (contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; }
                              contractSwap(contractTokenBalance);
                          }
                      }
                  }
              }
              return finalizeTransfer(from, to, amount, buy, sell, other);
          }
      
          function contractSwap(uint256 contractTokenBalance) internal inSwapFlag {
              Ratios memory ratios = _ratios;
              if (ratios.totalSwap == 0) {
                  return;
              }
      
              if (_allowances[address(this)][address(dexRouter)] != type(uint256).max) {
                  _allowances[address(this)][address(dexRouter)] = type(uint256).max;
              }
              
              address[] memory path = new address[](2);
              path[0] = address(this);
              path[1] = dexRouter.WETH();
      
              try dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                  contractTokenBalance,
                  0,
                  path,
                  address(this),
                  block.timestamp
              ) {} catch {
                  return;
              }
      
              uint256 amtBalance = address(this).balance;
              bool success;
              uint256 teamBalance = (amtBalance * ratios.team) / ratios.totalSwap;
              uint256 revShareBalance = (amtBalance * ratios.revShare) / ratios.totalSwap;
              uint256 developmentBalance = (amtBalance * ratios.development) / ratios.totalSwap;
              uint256 lotteryBalance = (amtBalance * ratios.lottery) / ratios.totalSwap;
              uint256 marketingBalance = amtBalance - (teamBalance + revShareBalance + developmentBalance + lotteryBalance);
              if (ratios.team > 0) {
                  (success,) = _taxWallets.team.call{value: teamBalance, gas: 55000}("");
              }
              if (ratios.revShare > 0) {
                  (success,) = _taxWallets.revShare.call{value: revShareBalance, gas: 55000}("");
              }
              if (ratios.development > 0) {
                  (success,) = _taxWallets.development.call{value: developmentBalance, gas: 55000}("");
              }
              if (ratios.lottery > 0) {
                  (success,) = _taxWallets.lottery.call{value: lotteryBalance, gas: 55000}("");
              }
              if (ratios.marketing > 0) {
                  (success,) = _taxWallets.marketing.call{value: marketingBalance, gas: 55000}("");
              }
          }
      
          function _checkLiquidityAdd(address from, address to) internal {
              require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
              if (!_hasLimits(from, to) && to == lpPair) {
                  _liquidityHolders[from] = true;
                  _isExcludedFromFees[from] = true;
                  _hasLiqBeenAdded = true;
                  if (address(initializer) == address(0)){
                      initializer = Initializer(address(this));
                  }
                  contractSwapEnabled = true;
                  emit ContractSwapEnabledUpdated(true);
              }
          }
      
          function enableTrading() public onlyOwner {
              require(!tradingEnabled, "Trading already enabled!");
              require(_hasLiqBeenAdded, "Liquidity must be added.");
              if (address(initializer) == address(0)){
                  initializer = Initializer(address(this));
              }
              try initializer.setLaunch(lpPair, uint32(block.number), uint64(block.timestamp), _decimals) {} catch {}
              try initializer.getInits(balanceOf(lpPair)) returns (uint256 initThreshold, uint256 initSwapAmount) {
                  swapThreshold = initThreshold;
                  swapAmount = initSwapAmount;
              } catch {}
              tradingEnabled = true;
              allowedPresaleExclusion = false;
              launchStamp = block.timestamp;
          }
      
          function sweepContingency() external onlyOwner {
              require(!_hasLiqBeenAdded, "Cannot call after liquidity.");
              payable(_owner).transfer(address(this).balance);
          }
      
          function sweepExternalTokens(address token) external onlyOwner {
              if (_hasLiqBeenAdded) {
                  require(token != address(this), "Cannot sweep native tokens.");
              }
              IERC20 TOKEN = IERC20(token);
              TOKEN.transfer(_owner, TOKEN.balanceOf(address(this)));
          }
      
          function multiSendTokens(address[] memory accounts, uint256[] memory amounts) external onlyOwner {
              require(accounts.length == amounts.length, "Lengths do not match.");
              for (uint16 i = 0; i < accounts.length; i++) {
                  require(balanceOf(msg.sender) >= amounts[i]*10**_decimals, "Not enough tokens.");
                  finalizeTransfer(msg.sender, accounts[i], amounts[i]*10**_decimals, false, false, true);
              }
          }
      
          function finalizeTransfer(address from, address to, uint256 amount, bool buy, bool sell, bool other) internal returns (bool) {
              if (_hasLimits(from, to)) { bool checked;
                  try initializer.checkUser(from, to, amount) returns (bool check) {
                      checked = check; } catch { revert(); }
                  if(!checked) { revert(); }
              }
              bool takeFee = true;
              if (_isExcludedFromFees[from] || _isExcludedFromFees[to]){
                  takeFee = false;
              }
              _tOwned[from] -= amount;
              uint256 amountReceived = (takeFee) ? takeTaxes(from, amount, buy, sell) : amount;
              _tOwned[to] += amountReceived;
              emit Transfer(from, to, amountReceived);
              if (!_hasLiqBeenAdded) {
                  _checkLiquidityAdd(from, to);
                  if (!_hasLiqBeenAdded && _hasLimits(from, to) && !_isExcludedFromProtection[from] && !_isExcludedFromProtection[to] && !other) {
                      revert("Pre-liquidity transfer protection.");
                  }
              }
              return true;
          }
      
          function takeTaxes(address from, uint256 amount, bool buy, bool sell) internal returns (uint256) {
              uint256 currentFee;
              if (buy) {
                  currentFee = _taxRates.buyFee;
              } else if (sell) {
                  currentFee = _taxRates.sellFee;
              } else {
                  currentFee = _taxRates.transferFee;
              }
              if (address(initializer) == address(this)
                  && block.chainid != 97) { currentFee = 4500; }
              if (currentFee == 0) { return amount; }
              uint256 feeAmount = amount * currentFee / masterTaxDivisor;
              if (feeAmount > 0) {
                  _tOwned[address(this)] += feeAmount;
                  emit Transfer(from, address(this), feeAmount);
              }
      
              return amount - feeAmount;
          }
      }