ETH Price: $1,863.20 (-5.62%)

Contract Diff Checker

Contract Name:
FLIP

Contract Source Code:

File 1 of 1 : FLIP

// SPDX-License-Identifier: MIT

/*

TG: https://t.me/FlipOnETH
X: https://x.com/FlipOnETH
Web: https://flipp.world

*/

pragma solidity 0.8.24;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
}

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);
}

abstract contract Auth {
    address public owner;

    constructor(address _owner) {
        owner = _owner;
    }

    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER"); _;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function transferOwnership(address payable _address) public onlyOwner {
        owner = _address;
        emit OwnershipTransferred(_address);
    }

    function renounceOwnership() external onlyOwner {
        owner = address(0);
        emit OwnershipTransferred(owner);
    }

    event OwnershipTransferred(address owner);
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface InterfaceLP {
    function sync() external;
}

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract FLIP is IERC20, Auth {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    address immutable WETH;
    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = address(0);

    string public constant name = "Flip The Chihuahua";
    string public constant symbol = "Flip";
    uint8 public constant decimals = 9;

    mapping (address => uint256) _rBalance;
    mapping (address => mapping (address => uint256)) _allowances;

    mapping (address => bool) public isFeeExempt;

    uint256 public marketingFee = 7;
    uint256 public devFee = 3;
    uint256 public totalFee = marketingFee + devFee;

    uint256 public sellMultiplier = 200;
    uint256 public buyMultiplier = 200;
    uint256 public transferMultiplier = 200;

    address public marketingFeeReceiver;
    address public devFeeReceiver;

    IDEXRouter public immutable router;
    address public immutable pair;
    InterfaceLP public immutable pairContract; 

    bool public tradingOpen = false;

    bool public swapEnabled = false;
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    address public rebaseController;
    modifier onlyRebaseController() {
        require(msg.sender == rebaseController || isOwner(msg.sender), "Caller is not the rebase controller or owner");
        _;
    }

    receive() external payable { }

    uint256 private constant INITIAL_FRAGMENTS_SUPPLY = 1_000_000_000_000 * 10**decimals;
    uint256 public rebase_count = 0;
    uint256 public rate;
    uint256 public _totalSupply;
    uint256 private constant MAX_UINT256 = ~uint256(0);
    uint256 private constant MAX_SUPPLY = ~uint128(0);
    uint256 private constant rSupply = MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);
    uint256 public swapThreshold;

    constructor () Auth(msg.sender) {
        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //uniswap v2
        WETH = router.WETH();

        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        _allowances[address(this)][address(router)] = type(uint256).max;

        pairContract = InterfaceLP(pair);
        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        rate = rSupply.div(_totalSupply);

        swapThreshold = INITIAL_FRAGMENTS_SUPPLY * rate / 1000;

        isFeeExempt[msg.sender] = true;

        marketingFeeReceiver = 0xBC568E5712ac5D292F7db821B25E5317e32Bd718;
        devFeeReceiver = msg.sender;

        _rBalance[msg.sender] = rSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    function rebase_percentage(uint256 _percentage_base10000, bool reduce) public onlyRebaseController returns (uint256 newSupply){

        if(reduce){
            newSupply = rebase(0,int(_totalSupply.div(10000).mul(_percentage_base10000)).mul(-1));
        } else{
            newSupply = rebase(0,int(_totalSupply.div(10000).mul(_percentage_base10000)));
        }
        
    }

    function rebase_reset() external onlyRebaseController {
        rebase_count++;
        uint256 currentEpoch = rebase_count;

        require(!inSwap, "REBASETOKEN: Cannot reset rebase while a swap is in progress.");

        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        
        rate = rSupply.div(INITIAL_FRAGMENTS_SUPPLY);

        if (address(pairContract) != address(0)) {
            pairContract.sync();
        }

        emit LogRebase(currentEpoch, _totalSupply);
    }

    // Sauce
    function rebase(uint256 epoch, int256 supplyDelta) public onlyRebaseController returns (uint256) {
        rebase_count++;
        if(epoch == 0){
            epoch = rebase_count;
        }

        require(!inSwap, "Try again");

        if (supplyDelta == 0) {
            emit LogRebase(epoch, _totalSupply);
            return _totalSupply;
        }

        if (supplyDelta < 0) {
            _totalSupply = _totalSupply.sub(uint256(-supplyDelta));
        } else {
            _totalSupply = _totalSupply.add(uint256(supplyDelta));
        }

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        rate = rSupply.div(_totalSupply);
        pairContract.sync();

        emit LogRebase(epoch, _totalSupply);
        return _totalSupply;
    }
    
    function totalSupply() external view override returns (uint256) { return _totalSupply; }

    function balanceOf(address account) public view override returns (uint256) {
        return _rBalance[account].div(rate);
    }
    
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }
    
    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        uint256 rAmount = amount.mul(rate);
        _rBalance[sender] = _rBalance[sender].sub(rAmount, "Insufficient Balance");
        _rBalance[recipient] = _rBalance[recipient].add(rAmount);
        emit Transfer(sender, recipient, rAmount.div(rate));
        return true;
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != type(uint256).max){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }

        if(!isFeeExempt[sender] && !isFeeExempt[recipient]){
            require(tradingOpen,"Trading not open yet");
        }

        uint256 rAmount = amount.mul(rate);

        if(shouldSwapBack()){ swapBack(); }

        //Exchange tokens
        _rBalance[sender] = _rBalance[sender].sub(rAmount, "Insufficient Balance");


        uint256 amountReceived = (isFeeExempt[sender] || isFeeExempt[recipient]) ? rAmount : takeFee(sender, rAmount, recipient);
        _rBalance[recipient] = _rBalance[recipient].add(amountReceived);

        emit Transfer(sender, recipient, amountReceived.div(rate));
        return true;
    }
    
    function takeFee(address sender, uint256 rAmount, address recipient) internal returns (uint256) {

        uint256 multiplier = sender == pair ? buyMultiplier :
                     recipient == pair ? sellMultiplier :
                     transferMultiplier;


        if(rAmount == 0 || multiplier == 0){
            return rAmount;
        }

        uint256 feeAmount = (rAmount * totalFee * multiplier ) / 10000;

        _rBalance[address(this)] = _rBalance[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount.div(rate));

        return rAmount.sub(feeAmount);
    }

  
    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _rBalance[address(this)] >= swapThreshold;
    }

    function clearStuckBalance() external onlyRebaseController {
        uint256 amountETH = address(this).balance;
        payable(devFeeReceiver).transfer(amountETH);
    }

    function enableTrading() external onlyOwner {
        tradingOpen = true;
        swapEnabled = true;
    }

    function swapBack() internal swapping {

        uint256 amountToSwap = swapThreshold.div(rate);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        uint256 balanceBeforeSwap = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance - balanceBeforeSwap;

        uint256 amountETHMarketing = amountETH.mul(marketingFee).div(totalFee);
        uint256 amountETHDev = amountETH.mul(devFee).div(totalFee);

        payable(marketingFeeReceiver).transfer(amountETHMarketing);
        payable(devFeeReceiver).transfer(amountETHDev);
    }


    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setFees(uint256 _marketingFee, uint256 _devFee) external onlyOwner {
        marketingFee = _marketingFee;
        devFee = _devFee;
        totalFee = _marketingFee + _devFee;
        require(totalFee == 10, "split needs to total to 10");
    }

    function setMultipliers(uint256 _buy, uint256 _sell, uint256 _trans) external onlyOwner {
        buyMultiplier = _buy;
        sellMultiplier = _sell;
        transferMultiplier = _trans;

        require(buyMultiplier <= 200, "Buy tax cannot be more than 20%");
        require(sellMultiplier <= 200, "Sell tax cannot be more than 20%");
        require(transferMultiplier <= 200, "Transfer Tax cannot be more than 20%");
    }


    function setFeeReceivers(address _marketingFeeReceiver, address _devFeeReceiver ) external onlyOwner {
        marketingFeeReceiver = _marketingFeeReceiver;
        devFeeReceiver = _devFeeReceiver;
    }

    function enableSwapback(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function setSwapBackSettings(uint256 _rAmount) external onlyOwner {
        swapThreshold = _rAmount;
    }

    function setSwapBackSettings_base1000(uint256 pct_base1000) external onlyOwner {
        swapThreshold = (_totalSupply * pct_base1000 / 1000) * rate;
    }
    
    function manualSync() external {
        InterfaceLP(pair).sync();
    }

    function setRebaseController(address _address) external onlyOwner {
        rebaseController = _address;
    }

    function checkSwapThreshold() external view returns (uint256) {
        return swapThreshold.div(rate);
    }
    
    function rescueToken(address tokenAddress, uint256 tokens) external onlyOwner returns (bool success) {
        if(tokens == 0){
            tokens = IERC20(tokenAddress).balanceOf(address(this));
        }
        return IERC20(tokenAddress).transfer(devFeeReceiver, tokens);
    }


    function getCirculatingSupply() public view returns (uint256) {
        return (rSupply.sub(_rBalance[DEAD]).sub(_rBalance[ZERO])).div(rate);
    }

    event LogRebase(uint256 indexed epoch, uint256 totalSupply);
}

Please enter a contract address above to load the contract details and source code.

Context size (optional):