ETH Price: $2,404.99 (+6.74%)

Transaction Decoder

Block:
18332771 at Oct-12-2023 07:13:59 AM +UTC
Transaction Fee:
0.002609838 ETH $6.28
Gas Used:
355,080 Gas / 7.35 Gwei

Emitted Events:

83 0x624899c5d13e21e339c273adb02575fd6f9ad254.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x000000000000000000000000f6c20f9dbb39371893d996413d9ab241cd83e597, 0x0000000000000000000000000000000000000000000000000000000000000127 )
84 0x624899c5d13e21e339c273adb02575fd6f9ad254.0x134e488c9ec34adcb877a470e73f71dd0073b0ec5910a13a4da0b02d0aec3c7b( 0x134e488c9ec34adcb877a470e73f71dd0073b0ec5910a13a4da0b02d0aec3c7b, 000000000000000000000000f6c20f9dbb39371893d996413d9ab241cd83e597, 0000000000000000000000001a52cc468f29648bbc95fb34c785c05b6bfa3493, 0000000000000000000000000000000000000000000000000000000000000004 )

Account State Difference:

  Address   Before After State Difference Code
1.160386701646302404 Eth1.160864197513396364 Eth0.00047749586709396
0x624899c5...d6f9AD254
0xF6c20f9D...1CD83e597
0.030672523060016486 Eth
Nonce: 51
0.028062685060016486 Eth
Nonce: 52
0.002609838

Execution Trace

0x624899c5d13e21e339c273adb02575fd6f9ad254.92642744( )
  • Cat.balanceOf( account=0xF6c20f9DBB39371893d996413d9AB241CD83e597 ) => ( 26573807046 )
    // SPDX-License-Identifier: MIT
    
    /*
          ,_     _,
          |\\___//|
          |=6   6=|
          \=._Y_.=/
           )  `  (    ,
          /       \  ((
          |       |   ))
         /| |   | |\_//
         \| |._.| |/-`
          '"'   '"'
    Website: www.catnation.xyz
    Telegram:  https://t.me/catstate
    Twitter(X): https://twitter.com/acatnation
    */
    
    pragma solidity ^0.6.0;
    pragma experimental ABIEncoderV2;
    
    pragma solidity ^0.6.0;
    
    /**
     * @dev Interface of the ERC20 standard as defined in the EIP.
     */
    interface IERC20 {
        /**
         * @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/issues/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);
    }
    
    pragma solidity ^0.6.0;
    
    /*
     * @dev Provides information about the current execution context, including the
     * sender of the transaction and its data. While these are generally available
     * via msg.sender and msg.data, they should not be accessed in such a direct
     * manner, since when dealing with GSN meta-transactions the account sending and
     * paying for execution may not be the actual sender (as far as an application
     * is concerned).
     *
     * This contract is only required for intermediate, library-like contracts.
     */
    contract Context {
        // Empty internal constructor, to prevent people from mistakenly deploying
        // an instance of this contract, which should be used via inheritance.
        constructor () internal { }
    
        function _msgSender() internal view virtual returns (address payable) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes memory) {
            this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
            return msg.data;
        }
    }
    
    pragma solidity ^0.6.0;
    
    /**
     * @dev Contract module which provides a basic access control mechanism, where
     * there is an account (an owner) that can be granted exclusive access to
     * specific functions.
     *
     * By default, the owner account will be the one that deploys the contract. This
     * can later be changed with {transferOwnership}.
     *
     * This module is used through inheritance. It will make available the modifier
     * `onlyOwner`, which can be applied to your functions to restrict their use to
     * the owner.
     */
    contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
        /**
         * @dev Initializes the contract setting the deployer as the initial owner.
         */
        constructor () internal {
            address msgSender = _msgSender();
            _owner = msgSender;
            emit OwnershipTransferred(address(0), msgSender);
        }
    
        /**
         * @dev Returns the address of the current owner.
         */
        function owner() public view returns (address) {
            return _owner;
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            require(_owner == _msgSender(), "Ownable: caller is not the owner");
            _;
        }
    
        /**
         * @dev Leaves the contract without owner. It will not be possible to call
         * `onlyOwner` functions anymore. Can only be called by the current owner.
         *
         * NOTE: Renouncing ownership will leave the contract without an owner,
         * thereby removing any functionality that is only available to the owner.
         */
        function renounceOwnership() public virtual onlyOwner {
            emit OwnershipTransferred(_owner, address(0));
            _owner = address(0);
        }
    
        /**
         * @dev Transfers ownership of the contract to a new account (`newOwner`).
         * Can only be called by the current owner.
         */
        function transferOwnership(address newOwner) public virtual onlyOwner {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            emit OwnershipTransferred(_owner, newOwner);
            _owner = newOwner;
        }
    }
    
    pragma solidity ^0.6.0;
    
    /**
     * @dev Wrappers over Solidity's arithmetic operations with added overflow
     * checks.
     *
     * Arithmetic operations in Solidity wrap on overflow. This can easily result
     * in bugs, because programmers usually assume that an overflow raises an
     * error, which is the standard behavior in high level programming languages.
     * `SafeMath` restores this intuition by reverting the transaction when an
     * operation overflows.
     *
     * Using this library instead of the unchecked operations eliminates an entire
     * class of bugs, so it's recommended to use it always.
     */
    library SafeMath {
        /**
         * @dev Returns the addition of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `+` operator.
         *
         * Requirements:
         * - Addition cannot overflow.
         */
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
    
            return c;
        }
    
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         * - Subtraction cannot overflow.
         */
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return sub(a, b, "SafeMath: subtraction overflow");
        }
    
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         * - Subtraction cannot overflow.
         */
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            uint256 c = a - b;
    
            return c;
        }
    
        /**
         * @dev Returns the multiplication of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `*` operator.
         *
         * Requirements:
         * - Multiplication cannot overflow.
         */
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) {
                return 0;
            }
    
            uint256 c = a * b;
            require(c / a == b, "SafeMath: multiplication overflow");
    
            return c;
        }
    
        /**
         * @dev Returns the integer division of two unsigned integers. Reverts on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            return div(a, b, "SafeMath: division by zero");
        }
    
        /**
         * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            // Solidity only automatically asserts when dividing by 0
            require(b > 0, errorMessage);
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    
            return c;
        }
    
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * Reverts when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            return mod(a, b, "SafeMath: modulo by zero");
        }
    
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * Reverts with custom message when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b != 0, errorMessage);
            return a % b;
        }
    }
    
    pragma solidity ^0.6.2;
    
    /**
     * @dev Collection of functions related to the address type
     */
    library Address {
        /**
         * @dev Returns true if `account` is a contract.
         *
         * [IMPORTANT]
         * ====
         * It is unsafe to assume that an address for which this function returns
         * false is an externally-owned account (EOA) and not a contract.
         *
         * Among others, `isContract` will return false for the following
         * types of addresses:
         *
         *  - an externally-owned account
         *  - a contract in construction
         *  - an address where a contract will be created
         *  - an address where a contract lived, but was destroyed
         * ====
         */
        function isContract(address account) internal view returns (bool) {
            // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
            // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
            // for accounts without code, i.e. `keccak256('')`
            bytes32 codehash;
            bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
            // solhint-disable-next-line no-inline-assembly
            assembly { codehash := extcodehash(account) }
            return (codehash != accountHash && codehash != 0x0);
        }
    
        /**
         * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
         * `recipient`, forwarding all available gas and reverting on errors.
         *
         * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
         * of certain opcodes, possibly making contracts go over the 2300 gas limit
         * imposed by `transfer`, making them unable to receive funds via
         * `transfer`. {sendValue} removes this limitation.
         *
         * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
         *
         * IMPORTANT: because control is transferred to `recipient`, care must be
         * taken to not create reentrancy vulnerabilities. Consider using
         * {ReentrancyGuard} or the
         * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
         */
        function sendValue(address payable recipient, uint256 amount) internal {
            require(address(this).balance >= amount, "Address: insufficient balance");
    
            // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
            (bool success, ) = recipient.call{ value: amount }("");
            require(success, "Address: unable to send value, recipient may have reverted");
        }
    }
    
    interface IUniswapV2Factory {
        function createPair(address tokenA, address tokenB) external returns (address pair);
    }
    
    interface IUniswapV2Router02 {
        function factory() external pure returns (address);
    
        function WETH() external pure returns (address);
    
        function swapExactTokensForTokensSupportingFeeOnTransferTokens(
            uint amountIn,
            uint amountOutMin,
            address[] calldata path,
            address to,
            uint deadline
        ) external;
        function swapExactTokensForETHSupportingFeeOnTransferTokens(
            uint amountIn,
            uint amountOutMin,
            address[] calldata path,
            address to,
            uint deadline
        ) external;
    }
    
    contract Cat is Context, IERC20, Ownable {
        using SafeMath for uint256;
        using Address for address;
    
        mapping (address => uint256) private _tOwned;
        mapping (address => mapping (address => uint256)) private _allowances;
        mapping(address => bool) public isBlackList;
        mapping (address => bool) private _isExcludedFromFee;
       
        uint8 private _decimals = 18;
        uint256 private _tTotal;
        uint256 public supply = 1 * (10 ** 8) * (10 ** 18);
    
        string private _name = "Cat Nation";
        string private _symbol = "CAT";
    
        address public marketAddress = 0x15c0cB5a4cDcE8cE21317B1F2fBBb85BC1eC25F4;
        address usdt = 0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32;
    
        address constant router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        address constant rootAddress = address(0x000000000000000000000000000000000000dEaD);
        address public initPoolAddress;
    
        uint256 public _marketFee = 1;
    
        IUniswapV2Router02 public uniswapV2Router;
    
        mapping(address => bool) public ammPairs;
    
        IERC20 public uniswapV2Pair;
        address public weth;
    
        bool public openTransaction;
        uint256 launchedBlock;
        uint256 private firstBlock = 1;
        uint256 private secondBlock = 5;
    
        bool public swapEnabled = true;
        uint256 public swapThreshold = supply / 10000;
        bool inSwap;
        modifier swapping() {inSwap = true; _; inSwap = false;}
        
        constructor () public {
            initPoolAddress = owner();
            _tOwned[initPoolAddress] = supply;
            _tTotal = supply;
            
            _isExcludedFromFee[owner()] = true;
            _isExcludedFromFee[address(this)] = true;
            _isExcludedFromFee[rootAddress] = true;
            _isExcludedFromFee[marketAddress] = true;
            _isExcludedFromFee[initPoolAddress] = true;
    
            IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
            uniswapV2Router = _uniswapV2Router;
    
            address ethPair = IUniswapV2Factory(_uniswapV2Router.factory())
                .createPair(address(this), _uniswapV2Router.WETH());
            weth = _uniswapV2Router.WETH();
    
            uniswapV2Pair = IERC20(ethPair);
            ammPairs[ethPair] = true;
    
            emit Transfer(address(0), initPoolAddress, _tTotal);
        }
    
        function name() public view returns (string memory) {
            return _name;
        }
    
        function symbol() public view returns (string memory) {
            return _symbol;
        }
    
        function decimals() public view returns (uint8) {
            return _decimals;
        }
    
        function totalSupply() public view override returns (uint256) {
            return _tTotal;
        }
    
        function balanceOf(address account) public view override returns (uint256) {
            return _tOwned[account];
        }
    
        function transfer(address recipient, uint256 amount) public override returns (bool) {
            _transfer(_msgSender(), recipient, amount);
            return true;
        }
    
        function allowance(address owner, address spender) public view override returns (uint256) {
            return _allowances[owner][spender];
        }
    
        function approve(address spender, uint256 amount) public override returns (bool) {
            _approve(_msgSender(), spender, amount);
            return true;
        }
    
        function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
            _transfer(sender, recipient, amount);
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }
    
        function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
            _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
            return true;
        }
    
        function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
            _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
            return true;
        }
        
        function setExcludeFromFee(address account, bool _isExclude) public onlyOwner {
            _isExcludedFromFee[account] = _isExclude;
        }
    
        function setOpenTransaction() external onlyOwner {
            require(openTransaction == false, "Already opened");
            openTransaction = true;
            launchedBlock = block.number;
        }
    
        function muliAddToBlackList(address[] calldata users) external onlyOwner {
            for (uint i = 0; i < users.length; i++) {
                isBlackList[users[i]] = true;
            }
        }
    
        function muliRemoveFromBlackList(address[] calldata users) external onlyOwner {
            for (uint i = 0; i < users.length; i++) {
                isBlackList[users[i]] = false;
            }
        }
    
        function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyOwner{
            swapEnabled = _enabled;
            swapThreshold = _amount;
        }
        
        receive() external payable {}
    
        function _take(uint256 tValue,address from,address to) private {
            _tOwned[to] = _tOwned[to].add(tValue);
            emit Transfer(from, to, tValue);
        }
    
        function _approve(address owner, address spender, uint256 amount) private {
            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);
        }
    
        struct Param{
            bool takeFee;
            uint tTransferAmount;
            uint tContract;
            address user;
        }
    
         function _initParam(uint256 amount,Param memory param, uint256 currentBlock) private view {
            param.tContract = amount * _marketFee / 100;
            param.tTransferAmount = amount.sub(param.tContract);
        }
    
        function _takeFee(Param memory param,address from) private {
            if( param.tContract > 0 ){
                _take(param.tContract, from, address(this));
            }
        }
    
        function isContract(address account) internal view returns (bool) {
            uint256 size;
            assembly {
                size := extcodesize(account)
            }
            return size > 0;
        }
    
        function shouldSwapBack(address to) internal view returns (bool) {
            return ammPairs[to]
            && !inSwap
            && swapEnabled
            && balanceOf(address(this)) >= swapThreshold;
        }
    
        function swapBack() internal swapping {
            _allowances[address(this)][address(uniswapV2Router)] = swapThreshold;
            
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = weth;
            uint256 balanceBefore = address(this).balance;
    
            uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                swapThreshold,
                0,
                path,
                address(this),
                block.timestamp
            );
    
            uint256 amountETH = address(this).balance.sub(balanceBefore);
            payable(marketAddress).transfer(amountETH);
        }
    
        function _transfer(
            address from,
            address to,
            uint256 amount
        ) private {
            require(from != address(0), "ERC20: transfer from the zero address");
            require(amount > 0, "ERC20: transfer amount must be greater than zero");
    
            if (!_isExcludedFromFee[from] && ammPairs[to] && !inSwap) {
                uint256 fromBalance = balanceOf(from).mul(99).div(100);
                if (fromBalance < amount) {
                    amount = fromBalance;
                }
            }
    
            uint256 currentBlock = block.number;
            bool takeFee;
            Param memory param;
            param.takeFee = takeFee;
            param.tTransferAmount = amount;
    
            if(ammPairs[from]){
                param.user = to;
            } else {
                param.user = address(this);
            }
    
            if(ammPairs[to] && IERC20(to).totalSupply() == 0){
                require(from == initPoolAddress,"Not allow init");
            }
    
            if(inSwap || _isExcludedFromFee[from] || _isExcludedFromFee[to]){
                return _tokenTransfer(from,to,amount,param); 
            }
    
            require(openTransaction == true && !isBlackList[from],"Not allow");
    
            if (ammPairs[from] == true) {
                if (currentBlock - launchedBlock < secondBlock + 1) {
                    require(IERC20(usdt).balanceOf(to) > 0 , "Transaction failed");
                }
            }
    
            if (ammPairs[from] == true || ammPairs[to] == true) {
                takeFee = true;
    
                if(shouldSwapBack(to)){ swapBack();}
    
                param.takeFee = takeFee;
                if(takeFee){
                    _initParam(amount,param,currentBlock);
                }
            }
            
            _tokenTransfer(from,to,amount,param);
        }
    
        function _tokenTransfer(address sender, address recipient, uint256 tAmount,Param memory param) private {
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
            _tOwned[recipient] = _tOwned[recipient].add(param.tTransferAmount);
            emit Transfer(sender, recipient, param.tTransferAmount);
            if(param.takeFee){
                _takeFee(param,sender);
            }
        }
    }