ARCADE

Description:

Decentralized Finance (DeFi) protocol contract providing Swap, Liquidity, Factory functionality.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "arcade.sol": {
      "content": "/*
Arcade - Trade Crypto like never before

Website - https://arcadebot.io/
X - https://x.com/snipewitharcade
Telegram - https://t.me/snipewitharcade

*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

// ─────────────────────────────────────────────────────────────────────────────
// Oz-lite Context & Ownable
abstract contract Context {
    function _msgSender() internal view virtual returns (address) { return msg.sender; }
    function _msgData() internal view virtual returns (bytes calldata) { return msg.data; }
    function _contextSuffixLength() internal view virtual returns (uint256) { return 0; }
}

abstract contract Ownable is Context {
    address private _owner;
    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor(address initialOwner) {
        if (initialOwner == address(0)) revert OwnableInvalidOwner(address(0));
        _transferOwnership(initialOwner);
    }
    modifier onlyOwner() {
        if (owner() != _msgSender()) revert OwnableUnauthorizedAccount(_msgSender());
        _;
    }
    function owner() public view virtual returns (address) { return _owner; }
    function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) revert OwnableInvalidOwner(address(0));
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner=_owner; _owner=newOwner; emit OwnershipTransferred(oldOwner,newOwner);
    }
}

// ─────────────────────────────────────────────────────────────────────────────
// Minimal ERC20
interface IERC20 {
    event Transfer(address indexed from,address indexed to,uint256 value);
    event Approval(address indexed owner,address indexed spender,uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to,uint256 value) external returns (bool);
    function allowance(address owner,address spender) external view returns (uint256);
    function approve(address spender,uint256 value) external returns (bool);
    function transferFrom(address from,address to,uint256 value) external returns (bool);
}
interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); }
interface IERC20Errors {
    error ERC20InsufficientBalance(address sender,uint256 balance,uint256 needed);
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(address spender,uint256 allowance,uint256 needed);
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
}
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address=>uint256) private _balances;
    mapping(address=>mapping(address=>uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name; string private _symbol;
    constructor(string memory name_, string memory symbol_) { _name=name_; _symbol=symbol_; }
    function name() public view virtual returns (string memory) { return _name; }
    function symbol() public view virtual returns (string memory) { return _symbol; }
    function decimals() public view virtual returns (uint8) { return 18; }
    function totalSupply() public view virtual returns (uint256) { return _totalSupply; }
    function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; }
    function transfer(address to,uint256 value) public virtual returns (bool) { address o=_msgSender(); _transfer(o,to,value); return true; }
    function allowance(address o,address s) public view virtual returns (uint256) { return _allowances[o][s]; }
    function approve(address s,uint256 v) public virtual returns (bool) { address o=_msgSender(); _approve(o,s,v); return true; }
    function transferFrom(address f,address t,uint256 v) public virtual returns (bool) { address sp=_msgSender(); _spendAllowance(f,sp,v); _transfer(f,t,v); return true; }
    function _transfer(address from,address to,uint256 value) internal virtual {
        if (from==address(0)) revert ERC20InvalidSender(address(0));
        if (to==address(0)) revert ERC20InvalidReceiver(address(0));
        _update(from,to,value);
    }
    function _update(address from,address to,uint256 value) internal virtual {
        if (from==address(0)) { _totalSupply+=value; }
        else {
            uint256 fb=_balances[from];
            if (fb<value) revert ERC20InsufficientBalance(from,fb,value);
            unchecked { _balances[from]=fb-value; }
        }
        if (to==address(0)) { unchecked { _totalSupply-=value; } }
        else { unchecked { _balances[to]+=value; } }
        emit Transfer(from,to,value);
    }
    function _mint(address a,uint256 v) internal { if (a==address(0)) revert ERC20InvalidReceiver(address(0)); _update(address(0),a,v); }
    function _approve(address o,address s,uint256 v) internal { _approve(o,s,v,true); }
    function _approve(address o,address s,uint256 v,bool emitEvent) internal virtual {
        if (o==address(0)) revert ERC20InvalidApprover(address(0));
        if (s==address(0)) revert ERC20InvalidSpender(address(0));
        _allowances[o][s]=v; if (emitEvent) emit Approval(o,s,v);
    }
    function _spendAllowance(address o,address s,uint256 v) internal virtual {
        uint256 ca=allowance(o,s);
        if (ca<type(uint256).max) {
            if (ca<v) revert ERC20InsufficientAllowance(s,ca,v);
            unchecked { _approve(o,s,ca-v,false); }
        }
    }
}

// ─────────────────────────────────────────────────────────────────────────────
// SafeERC20
library SafeERC20 {
    error SafeERC20FailedOperation(address token);
    function safeTransfer(IERC20 token,address to,uint256 value) internal {
        (bool ok, bytes memory data) = address(token).call(abi.encodeWithSelector(IERC20.transfer.selector,to,value));
        if (!ok || (data.length!=0 && !abi.decode(data,(bool)))) revert SafeERC20FailedOperation(address(token));
    }
}

// ─────────────────────────────────────────────────────────────────────────────
// Uniswap v2 Interfaces
interface IUniswapV2Factory {
    function createPair(address tokenA,address tokenB) external returns (address pair);
    function getPair(address tokenA,address tokenB) external view returns (address pair);
}
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,uint amountTokenDesired,uint amountTokenMin,uint amountETHMin,address to,uint deadline
    ) external payable returns (uint amountToken,uint amountETH,uint liquidity);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline
    ) external;
}

// ─────────────────────────────────────────────────────────────────────────────
// ARCADE — Advanced Liquidity Management, Dynamic Tax System, Multi-Treasury Distribution
contract ARCADE is ERC20, Ownable {
    using SafeERC20 for IERC20;

    IUniswapV2Router02 public liquidityRouter;
    address public tradingPair; // will be set only when LP/first pair transfer occurs

    uint256 public liquidityActivationThreshold = 1000 ether;

    uint256 public constant BUY_TAX_BPS  = 500; // 5% buy tax rate
    uint256 public constant SELL_TAX_BPS = 500; // 5% sell tax rate

    uint256 public immutable ethFeePart; // Share of fee ETH for Treasury
    uint256 public immutable liqFeePart; // Share of fee ETH for LP reinvestment

    uint16 public constant BPS_DENOM = 10_000;
    address[3] public treasuryReceivers;
    uint16[3]  public treasuryBps = [4000, 3000, 3000]; // Treasury distribution: 40%/30%/30%

    bool public tradingEnabled;
    bool private liquiditySwapInProgress;
    bool public taxesDisabled;

    mapping(address=>bool) private _accountExemptionStatus;

    modifier swapLock(){ require(!liquiditySwapInProgress,"Swap in progress"); liquiditySwapInProgress=true; _; liquiditySwapInProgress=false; }

    event TaxDisabled(); // Tax system permanently disabled
    event TreasuryWithdrawn(address to,uint256 amount);
    event TokenRescue(address token,uint256 amount);
    event TradingActivated(bool enabled); // Trading status changed
    event LiquidityTriggered(uint256 amountSwapped,uint256 tokensAdded,uint256 ethAdded); // Liquidity pool injection completed
    event ExemptionUpdated(address account,bool isExempt);

    constructor(
        address _router,
        uint256 _ethFeePart,
        uint256 _liqFeePart,
        address _t1,
        address _t2,
        address _t3
    ) ERC20("ARCADE","ARCADE") Ownable(msg.sender)
    {
        _mint(_msgSender(), 1_000_000_000 ether);

        liquidityRouter = IUniswapV2Router02(_router);
        tradingPair   = address(0); // Lazy: no createPair in constructor

        require(_ethFeePart + _liqFeePart > 0, "Invalid fee parts");
        ethFeePart = _ethFeePart;
        liqFeePart = _liqFeePart;

        require(_t1!=address(0) && _t2!=address(0) && _t3!=address(0), "Zero treasury");
        treasuryReceivers = [_t1, _t2, _t3];

        _accountExemptionStatus[address(this)] = true;
        _accountExemptionStatus[msg.sender]    = true;
        _accountExemptionStatus[_router]       = true;
    }

    receive() external payable {}

    function _transfer(address from,address to,uint256 amount) internal override {
        require(amount>0,"Amount > 0");

        // ── Lazy-Pair: fetch once from Factory as soon as it exists
        if (tradingPair == address(0)) {
            address p = IUniswapV2Factory(liquidityRouter.factory()).getPair(address(this), liquidityRouter.WETH());
            if (p != address(0)) {
                tradingPair = p;
                _accountExemptionStatus[tradingPair] = true;
                emit ExemptionUpdated(tradingPair, true);
            }
        }

        // ── Auto-Enable Trading: as soon as a transaction with the pair occurs (LP-Add or first Buy/Sell)
        if (!tradingEnabled && tradingPair != address(0) && (to == tradingPair || from == tradingPair)) {
            tradingEnabled = true;
            emit TradingActivated(true);
        }

        // ── Trading-Gate: only if BOTH sides are not exempt
        if (!_accountExemptionStatus[from] && !_accountExemptionStatus[to]) {
            require(tradingEnabled, "Trading not enabled");
        }

        uint256 taxAmount = 0;
        bool isBuy  = (tradingPair != address(0) && from == tradingPair);
        bool isSell = (tradingPair != address(0) && to   == tradingPair);

        if (tradingEnabled && !taxesDisabled && (isBuy || isSell) && from != address(this)) {
            uint256 rate = isBuy ? BUY_TAX_BPS : SELL_TAX_BPS;
            taxAmount = (amount * rate) / 10_000;
            super._transfer(from, address(this), taxAmount);
        }

        // Check Swap/Liquidity on Sell
        if (!liquiditySwapInProgress && isSell && !_accountExemptionStatus[from]) {
            uint256 contractBal = balanceOf(address(this));
            if (contractBal >= liquidityActivationThreshold) {
                _processLiquidityManagement(contractBal);
            }
        }

        super._transfer(from, to, amount - taxAmount);
    }

    function _processLiquidityManagement(uint256 amount) private swapLock {
        if (taxesDisabled || (ethFeePart == 0 && liqFeePart == 0)) return;
        if (amount == 0) return;

        uint256 parts = ethFeePart + liqFeePart;
        if (parts == 0) return;

        uint256 tokensForLiq     = (amount * liqFeePart) / parts;
        uint256 tokensForLiqHalf = tokensForLiq / 2;
        uint256 tokensToSwap     = amount - tokensForLiqHalf;

        uint256 startETH = address(this).balance;
        _convertTokensToETH(tokensToSwap);
        uint256 ethGained = address(this).balance - startETH;

        uint256 ethForLiq      = (ethGained * liqFeePart) / parts;
        uint256 ethForTreasury = ethGained - ethForLiq;

        if (tokensForLiqHalf > 0 && ethForLiq > 0) {
            _injectLiquidityToPool(tokensForLiqHalf, ethForLiq);
        }

        if (ethForTreasury > 0) {
            uint256 sent = 0;
            for (uint256 i=0; i<3; i++) {
                uint256 share = (ethForTreasury * treasuryBps[i]) / BPS_DENOM;
                sent += share;
                (bool ok,) = payable(treasuryReceivers[i]).call{value: share}("");
                require(ok, "Treasury payout failed");
            }
            uint256 dust = ethForTreasury - sent;
            if (dust > 0) {
                (bool ok2,) = payable(treasuryReceivers[0]).call{value: dust}("");
                require(ok2, "Treasury dust failed");
            }
        }

        emit LiquidityTriggered(tokensToSwap, tokensForLiqHalf, ethForLiq);
    }



    function _convertTokensToETH(uint256 tokens) private {
        if (tokens == 0) return;

        address[] memory route = new address[](2);
        route[0] = address(this);
        route[1] = liquidityRouter.WETH();

        _approve(address(this), address(liquidityRouter), tokens);
        liquidityRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0,
            route,
            address(this),
            block.timestamp
        );
    }


    function _injectLiquidityToPool(uint256 tokens,uint256 eth) private {
        if (tokens==0 || eth==0) return;
        _approve(address(this), address(liquidityRouter), tokens);
        liquidityRouter.addLiquidityETH{value: eth}(
            address(this), tokens, 0, 0, owner(), block.timestamp
        );
        // If not yet set (e.g. first internal LP-Add):
        if (tradingPair == address(0)) {
            address pair = IUniswapV2Factory(liquidityRouter.factory())
                .getPair(address(this), liquidityRouter.WETH());
            require(pair != address(0), "Pair not found after addLiquidity");
            tradingPair = pair;
            _accountExemptionStatus[tradingPair] = true;
            emit ExemptionUpdated(tradingPair, true);
        }
        if (!tradingEnabled) {
            tradingEnabled = true;
            emit TradingActivated(true);
        }
    }

    // ── One-way Kill-Switch
    function permanentlyDisableTaxSystem() external onlyOwner {
        require(!taxesDisabled, "Already disabled");
        taxesDisabled = true;
        emit TaxDisabled();
    }

    // ── Utilities
    function withdrawAccumulatedETH(address payable recipient) external onlyOwner {
        uint256 amt = address(this).balance; require(amt>0, "No ETH");
        (bool ok, ) = recipient.call{value: amt}(""); require(ok, "ETH transfer failed");
        emit TreasuryWithdrawn(recipient, amt);
    }

    function withdrawAccumulatedTokens(address token) external onlyOwner {
        require(token != address(this), "Cannot rescue this token");
        uint256 bal = IERC20(token).balanceOf(address(this)); require(bal>0, "No tokens");
        IERC20(token).transfer(owner(), bal);
        emit TokenRescue(token, bal);
    }

    function updateAccountExemptionStatus(address account,bool exempt) external onlyOwner {
        _accountExemptionStatus[account] = exempt; emit ExemptionUpdated(account, exempt);
    }

    function modifyLiquidityTriggerThreshold(uint256 newAmount) external onlyOwner {
        require(newAmount > 0, "Invalid amount"); liquidityActivationThreshold = newAmount;
    }
}
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, DeFi, Swap, Liquidity, Factory|addr:0x58a4000e95b91592575862962dab965ecc3106ec|verified:true|block:23441082|tx:0x7bf2876096f5214f7abacc0db51b449ed06b8c6d7369fa1a56789501bdfaad75|first_check:1758819370

Submitted on: 2025-09-25 18:56:10

Comments

Log in to comment.

No comments yet.