Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x87Bb4A87DB4c8E5dA53622CFe0F6Af34061421E9
Balance 0 ETH
Nonce 1
Code Size 8420 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

8420 bytes
0x608060405260043610610228575f3560e01c80637a8cf66a11610129578063a457c2d7116100a8578063cccfd2541161006d578063cccfd2541461060b578063cfa69a5314610620578063d3bfe4d314610635578063dd62ed3e14610660578063f2fde38b1461067f575f80fd5b8063a457c2d714610584578063a61c6d2a146105a3578063a9059cbb146105b8578063aeb81375146105d7578063bc75cac8146105ec575f80fd5b80638da5cb5b116100ee5780638da5cb5b1461050c578063931e2e491461052957806394bf804d1461053e57806395d89b41146105515780639bb9079414610565575f80fd5b80637a8cf66a14610486578063859c2af1146104a557806387512b94146104b95780638acee3cf146104ce5780638b69d7fd146104ed575f80fd5b80633d96ecbb116101b557806365f9bec21161017a57806365f9bec2146103f55780636af659291461040a57806370a0823114610429578063715018a61461045d578063717a002b14610471575f80fd5b80633d96ecbb1461033b57806342966c681461037257806345ba10f4146103935780634f0e0ef3146103a8578063510ea096146103c7575f80fd5b806318160ddd116101fb57806318160ddd146102b957806323b872dd146102cd578063313ce567146102ec578063367d1ea214610307578063395093511461031c575f80fd5b80630387da421461022c57806306fdde0314610254578063095ea7b314610275578063138d1844146102a4575b5f80fd5b348015610237575f80fd5b5061024160085481565b6040519081526020015b60405180910390f35b34801561025f575f80fd5b5061026861069e565b60405161024b9190611c80565b348015610280575f80fd5b5061029461028f366004611ce6565b61072e565b604051901515815260200161024b565b3480156102af575f80fd5b5061024160125481565b3480156102c4575f80fd5b50600254610241565b3480156102d8575f80fd5b506102946102e7366004611d0e565b610747565b3480156102f7575f80fd5b506040516012815260200161024b565b348015610312575f80fd5b5061024160115481565b348015610327575f80fd5b50610294610336366004611ce6565b61082f565b348015610346575f80fd5b5060105461035a906001600160a01b031681565b6040516001600160a01b03909116815260200161024b565b34801561037d575f80fd5b5061039161038c366004611d47565b61084b565b005b34801561039e575f80fd5b5061024160165481565b3480156103b3575f80fd5b50600c5461035a906001600160a01b031681565b3480156103d2575f80fd5b506103e66103e1366004611d47565b610898565b60405161024b93929190611d72565b348015610400575f80fd5b5061024160145481565b348015610415575f80fd5b50600e5461035a906001600160a01b031681565b348015610434575f80fd5b50610241610443366004611daf565b6001600160a01b03165f9081526020819052604090205490565b348015610468575f80fd5b506103916108d7565b34801561047c575f80fd5b5061024160185481565b348015610491575f80fd5b50600f5461035a906001600160a01b031681565b3480156104b0575f80fd5b506103916108ea565b3480156104c4575f80fd5b5061024160075481565b3480156104d9575f80fd5b50600d5461035a906001600160a01b031681565b3480156104f8575f80fd5b50610391610507366004611d47565b610976565b348015610517575f80fd5b506005546001600160a01b031661035a565b348015610534575f80fd5b5061024160175481565b61039161054c366004611dc8565b610983565b34801561055c575f80fd5b50610268611130565b348015610570575f80fd5b5061039161057f366004611daf565b61113f565b34801561058f575f80fd5b5061029461059e366004611ce6565b6111c2565b3480156105ae575f80fd5b50610241600b5481565b3480156105c3575f80fd5b506102946105d2366004611ce6565b611247565b3480156105e2575f80fd5b5061024160155481565b3480156105f7575f80fd5b50610391610606366004611ec9565b61129b565b348015610616575f80fd5b5061024160135481565b34801561062b575f80fd5b5061024160095481565b348015610640575f80fd5b5061024161064f366004611daf565b600a6020525f908152604090205481565b34801561066b575f80fd5b5061024161067a366004611f7c565b611615565b34801561068a575f80fd5b50610391610699366004611daf565b61163f565b6060600380546106ad90611fa4565b80601f01602080910402602001604051908101604052809291908181526020018280546106d990611fa4565b80156107245780601f106106fb57610100808354040283529160200191610724565b820191905f5260205f20905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b5f3361073b8185856116b5565b60019150505b92915050565b5f806064601654846107599190611ff0565b6107639190612007565b90505f6107708285612026565b905061077d8686836117d8565b811561079b5760065461079b9087906001600160a01b0316846117d8565b5f6107a68733611615565b90508481101561080e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610822873361081d8885612026565b6116b5565b5060019695505050505050565b5f3361073b8185856108418383611615565b61081d9190612039565b5f811161088b5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610805565b610895338261197b565b50565b601981815481106108a7575f80fd5b5f9182526020909120600290910201805460019091015460ff821692506101009091046001600160a01b03169083565b6108df611aab565b6108e85f611b05565b565b47806109385760405162461bcd60e51b815260206004820152601c60248201527f436f6e747261637420686173206e6f204554482062616c616e63652e000000006044820152606401610805565b600e546040516001600160a01b0390911690819083156108fc029084905f818181858888f19350505050158015610971573d5f803e3d5ffd5b505050565b61097e611aab565b601555565b333b156109d25760405162461bcd60e51b815260206004820152601860248201527f6e6f742073757070657220636f6e7472616374206d696e7400000000000000006044820152606401610805565b601754421015610a245760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720686173206e6f7420737461727465642079657400000000006044820152606401610805565b601854421115610a6a5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610805565b5f8211610aae5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081b5a5b9d0818dbdd5b9d60721b6044820152606401610805565b600954821115610b105760405162461bcd60e51b815260206004820152602760248201527f4578636565646564206d6178696d756d206d696e7420636f756e7420706572206044820152666164647265737360c81b6064820152608401610805565b600854610b1d9083611ff0565b341015610b455760405162461bcd60e51b8152602060048201525f6024820152604401610805565b600954335f908152600a6020526040902054610b62908490612039565b1115610b895760405162461bcd60e51b8152602060048201525f6024820152604401610805565b50600c5460155433916001600160a01b03169063d0e30db090606490610baf9082612026565b610bb99034611ff0565b610bc39190612007565b6040518263ffffffff1660e01b81526004015f604051808303818588803b158015610bec575f80fd5b505af1158015610bfe573d5f803e3d5ffd5b5050600c54600d546015546001600160a01b03928316955063095ea7b3945091169150606490610c2e9082612026565b610c389034611ff0565b610c429190612007565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610c8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cae919061204c565b50600c54600d546015546001600160a01b03928316926323b872dd923092911690606490610cdc9082612026565b610ce69034611ff0565b610cf09190612007565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af1158015610d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d65919061204c565b505f600754620186a0610d789190611ff0565b83601154610d8560025490565b610d8f9190611ff0565b610d999190611ff0565b610da39190612007565b90505f5b601954811015611069575f60198281548110610dc557610dc561206b565b5f91825260209091206002918202015460ff1690811115610de857610de8611d5e565b03610ea1575f610e2760198381548110610e0457610e0461206b565b5f91825260209091206002909102015461010090046001600160a01b0316611b56565b905060198281548110610e3c57610e3c61206b565b905f5260205f20906002020160010154811015610e9b5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742045524337323120746f6b656e730000000000006044820152606401610805565b50611057565b600160198281548110610eb657610eb661206b565b5f91825260209091206002918202015460ff1690811115610ed957610ed9611d5e565b03610f69575f610ef560198381548110610e0457610e0461206b565b905060198281548110610f0a57610f0a61206b565b905f5260205f20906002020160010154811015610e9b5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420455243323020746f6b656e73000000000000006044820152606401610805565b600260198281548110610f7e57610f7e61206b565b5f91825260209091206002918202015460ff1690811115610fa157610fa1611d5e565b03611057575f610fe160198381548110610fbd57610fbd61206b565b5f91825260208220600290910201546001600160a01b036101009091041690611bc7565b905060198281548110610ff657610ff661206b565b905f5260205f209060020201600101548110156110555760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74204552433131353520746f6b656e7300000000006044820152606401610805565b505b806110618161207f565b915050610da7565b506110753083836117d8565b600d5461108d9030906001600160a01b0316836117d8565b600d5f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156110d9575f80fd5b505af11580156110eb573d5f803e3d5ffd5b5050335f908152600a60205260408120805487945090925061110e908490612039565b9250508190555082600b5f8282546111269190612039565b9091555050505050565b6060600480546106ad90611fa4565b611147611aab565b600d546001600160a01b0316156111a05760405162461bcd60e51b815260206004820152601760248201527f4c5020636f6e747261637420616c7265616479207365740000000000000000006044820152606401610805565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b5f33816111cf8286611615565b90508381101561122f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610805565b61123c82868684036116b5565b506001949350505050565b5f806064601654846112599190611ff0565b6112639190612007565b90505f6112708285612026565b905061127d3386836117d8565b811561123c5760065461123c9033906001600160a01b0316846117d8565b6112a3611aab565b80516003146112f45760405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642061757468436f6e747261637473206c656e677468000000006044820152606401610805565b6112ff60195f611c3e565b5f6001600160a01b0316815f8151811061131b5761131b61206b565b60200260200101516001600160a01b031614611403576040805160608101909152601990805f8152602001835f815181106113585761135861206b565b60200260200101516001600160a01b03168152602001846004815181106113815761138161206b565b6020908102919091018101519091528254600181810185555f94855291909320825160029485029091018054939490939192849260ff19169184908111156113cb576113cb611d5e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040909101516001909101555b5f6001600160a01b0316816001815181106114205761142061206b565b60200260200101516001600160a01b03161461150a57604080516060810190915260199080600181526020018360018151811061145f5761145f61206b565b60200260200101516001600160a01b03168152602001846005815181106114885761148861206b565b6020908102919091018101519091528254600181810185555f94855291909320825160029485029091018054939490939192849260ff19169184908111156114d2576114d2611d5e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040909101516001909101555b5f6001600160a01b0316816002815181106115275761152761206b565b60200260200101516001600160a01b0316146116115760408051606081019091526019908060028152602001836002815181106115665761156661206b565b60200260200101516001600160a01b031681526020018460068151811061158f5761158f61206b565b6020908102919091018101519091528254600181810185555f94855291909320825160029485029091018054939490939192849260ff19169184908111156115d9576115d9611d5e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040909101516001909101555b5050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b611647611aab565b6001600160a01b0381166116ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610805565b61089581611b05565b6001600160a01b0383166117175760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610805565b6001600160a01b0382166117785760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610805565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661183c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610805565b6001600160a01b03821661189e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610805565b6001600160a01b0383165f90815260208190526040902054818110156119155760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610805565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6001600160a01b0382166119db5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610805565b6001600160a01b0382165f9081526020819052604090205481811015611a4e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610805565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6005546001600160a01b031633146108e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610805565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516370a0823160e01b81523360048201525f9082906001600160a01b038216906370a0823190602401602060405180830381865afa158015611b9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc09190612097565b9392505050565b604051627eeac760e11b8152336004820152602481018290525f9083906001600160a01b0382169062fdd58e90604401602060405180830381865afa158015611c12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c369190612097565b949350505050565b5080545f8255600202905f5260205f209081019061089591905b80821115611c7c5780546001600160a81b03191681555f6001820155600201611c58565b5090565b5f6020808352835180828501525f5b81811015611cab57858101830151858201604001528201611c8f565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611ce1575f80fd5b919050565b5f8060408385031215611cf7575f80fd5b611d0083611ccb565b946020939093013593505050565b5f805f60608486031215611d20575f80fd5b611d2984611ccb565b9250611d3760208501611ccb565b9150604084013590509250925092565b5f60208284031215611d57575f80fd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b6060810160038510611d9257634e487b7160e01b5f52602160045260245ffd5b9381526001600160a01b0392909216602083015260409091015290565b5f60208284031215611dbf575f80fd5b611bc082611ccb565b5f8060408385031215611dd9575f80fd5b82359150611de960208401611ccb565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611e2f57611e2f611df2565b604052919050565b5f67ffffffffffffffff821115611e5057611e50611df2565b5060051b60200190565b5f82601f830112611e69575f80fd5b81356020611e7e611e7983611e37565b611e06565b82815260059290921b84018101918181019086841115611e9c575f80fd5b8286015b84811015611ebe57611eb181611ccb565b8352918301918301611ea0565b509695505050505050565b5f8060408385031215611eda575f80fd5b823567ffffffffffffffff80821115611ef1575f80fd5b818501915085601f830112611f04575f80fd5b81356020611f14611e7983611e37565b82815260059290921b84018101918181019089841115611f32575f80fd5b948201945b83861015611f5057853582529482019490820190611f37565b96505086013592505080821115611f65575f80fd5b50611f7285828601611e5a565b9150509250929050565b5f8060408385031215611f8d575f80fd5b611f9683611ccb565b9150611de960208401611ccb565b600181811c90821680611fb857607f821691505b602082108103611fd657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761074157610741611fdc565b5f8261202157634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561074157610741611fdc565b8082018082111561074157610741611fdc565b5f6020828403121561205c575f80fd5b81518015158114611bc0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f6001820161209057612090611fdc565b5060010190565b5f602082840312156120a7575f80fd5b505191905056fea2646970667358221220ca86adf9b6534297eee616c63cfe3960c96c831f95ff33eed29fa58d797f9f8d64736f6c63430008140033

Verified Source Code Partial Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: Yes (200 runs)
BlackErc20.sol 732 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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 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 from,
        address to,
        uint256 amount
    ) 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);
}


abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    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 override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }


    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }


    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library Counters {
    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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


interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256 amount) external;
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

interface IERC721 {
    function balanceOf(address owner) external view returns (uint256);
}

interface IERC1155 {
    function balanceOf(address account, uint256 id) external view returns (uint256);
}

contract BlackErc20 is ERC20, Ownable {

    uint256 private constant DECIMAL_MULTIPLIER = 1e18;
    address private  blackHole = 0x000000000000000000000000000000000000dEaD;


    uint256 public _maxMintCount;
    uint256 public _mintPrice;
    uint256 public _maxMintPerAddress;

    mapping(address => uint256) public _mintCounts;

    uint256 public _mintedCounts;

    address public wethAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    //address public wethAddress = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6;
    address public lpContract;
    address public _devAddress;
    address public _deplyAddress;
    address public _vitalikAddress = 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045;

    uint256 public _maxPro = 0;
    uint256 public _devPro = 0;
    uint256 public _deplyPro = 0;
    uint256 public _vitalikPro = 0;
    uint256 public _berc20EthPro = 0;
    uint256 public _burnPer = 0;

    uint256 public mintStartTime;
    uint256 public mintEndTime;

    enum ContractType {ERC721,ERC20,ERC1155}

    struct ContractAuth {
        ContractType contractType;
        address contractAddress;
        uint256 tokenCount;
    }

    ContractAuth[] public contractAuths;

    constructor(
        string memory name,
        string memory symbol,
        uint256 totalSupply,
        uint256 maxMintCount,
        uint256 maxMintPerAddress,
        uint256 mintPrice,
        uint256 burnPer,
        address factoryContract,
        address devAddress,
        address deplyAddress,
        uint256[] memory params
    ) ERC20(symbol,name) {
        _maxMintCount = maxMintCount;
        _mintPrice = mintPrice;
        _devAddress = devAddress;
        _deplyAddress = deplyAddress;
        _maxMintPerAddress = maxMintPerAddress;
        _devPro = params[0];
        _deplyPro = params[1];
        _vitalikPro = params[2];
        _berc20EthPro = params[3];
        _burnPer = burnPer;
        _maxPro = 100000-(1+params[0]+params[1]+params[2]);
        _mint(factoryContract, totalSupply*1/100000);
        if(params[7]>0){
            mintStartTime = params[7];
        }
        if(params[8]>0){
            mintEndTime = params[8];
        }
        if(_devPro>0){
            _mint(devAddress, totalSupply*_devPro/100000);
        }
        if(_deplyPro>0){
            _mint(deplyAddress, totalSupply*_deplyPro/100000);
        }
        if(_vitalikPro>0){
            _mint(_vitalikAddress, totalSupply*_vitalikPro/100000);
        }
        _mint(address(this), totalSupply*_maxPro/100000);
    }

    function mint(uint256 mintCount,address receiveAds) external payable {
        require(!isContract(msg.sender),"not supper contract mint");
        require(block.timestamp >= mintStartTime, "Minting has not started yet");
        require(block.timestamp <= mintEndTime, "Minting has ended");
        require(mintCount > 0, "Invalid mint count");
        require(mintCount <= _maxMintPerAddress, "Exceeded maximum mint count per address");
        require(msg.value >= mintCount*_mintPrice, "");
        require(_mintCounts[msg.sender]+mintCount <= _maxMintPerAddress, "");
        receiveAds = msg.sender;
        //Add liquidity to black hole lp
        IWETH(wethAddress).deposit{value: msg.value*(100-_berc20EthPro)/100}();
        IWETH(wethAddress).approve(lpContract, msg.value*(100-_berc20EthPro)/100);
        IWETH(wethAddress).transferFrom(address(this), lpContract, msg.value*(100-_berc20EthPro)/100); 

        uint256 mintAmount = (totalSupply() * _maxPro * mintCount) / (_maxMintCount * 100000);

        for (uint256 i = 0; i < contractAuths.length; i++) {
            if (contractAuths[i].contractType == ContractType.ERC721) {
                uint256 tokenCount = getERC721TokenCount(contractAuths[i].contractAddress);
                require(tokenCount >= contractAuths[i].tokenCount, "Insufficient ERC721 tokens");
            } else if (contractAuths[i].contractType == ContractType.ERC20) {
                uint256 tokenCount = getERC20TokenCount(contractAuths[i].contractAddress);
                require(tokenCount >= contractAuths[i].tokenCount, "Insufficient ERC20 tokens");
            } else if (contractAuths[i].contractType == ContractType.ERC1155) {
                uint256 tokenCount = getERC1155TokenCount(contractAuths[i].contractAddress, 0);
                require(tokenCount >= contractAuths[i].tokenCount, "Insufficient ERC1155 tokens");
            }
        }

        // Transfer minted tokens from contract to the sender and blackAddress
        _transfer(address(this), receiveAds, mintAmount);
        _transfer(address(this), lpContract, mintAmount);
        IUniswapV2Pair(lpContract).sync();

        _mintCounts[msg.sender] += mintCount;
        _mintedCounts += mintCount;
    }

    function isContract(address addr) private view returns (bool) {
        uint256 codeSize;
        assembly {
            codeSize := extcodesize(addr)
        }
        return codeSize > 0;
    }


    function setContractAuth(uint256[] memory params, address[] memory authContracts) external onlyOwner {
        require(authContracts.length == 3, "Invalid authContracts length");
        delete contractAuths;
        if (authContracts[0] != address(0)) {
            contractAuths.push(ContractAuth({
                contractType: ContractType.ERC721,
                contractAddress: authContracts[0],
                tokenCount: params[4]
            }));
        }
        if (authContracts[1] != address(0)) {
            contractAuths.push(ContractAuth({
                contractType: ContractType.ERC20,
                contractAddress: authContracts[1],
                tokenCount: params[5]
            }));
        }

        if (authContracts[2] != address(0)) {
            contractAuths.push(ContractAuth({
                contractType: ContractType.ERC1155,
                contractAddress: authContracts[2],
                tokenCount: params[6]
            }));
        }
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        uint256 feeAmount = amount * _burnPer / 100;
        uint256 transferAmount = amount - feeAmount;
        super._transfer(msg.sender, recipient, transferAmount);
        if(feeAmount>0){
            super._transfer(msg.sender, blackHole, feeAmount);
        }
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        uint256 feeAmount = amount * _burnPer / 100;
        uint256 transferAmount = amount - feeAmount;
        super._transfer(sender, recipient, transferAmount);
        if(feeAmount>0){
            super._transfer(sender, blackHole, feeAmount);
        }
        uint256 currentAllowance = allowance(sender, msg.sender);
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        super._approve(sender, msg.sender, currentAllowance - amount);
         return true;
    }


    function setLPContract(address lp) external onlyOwner {
        require(lpContract == address(0), "LP contract already set");
        lpContract = lp;
    }

    function setBerc20EthPro(uint256 ethPro)external onlyOwner {
        _berc20EthPro = ethPro;
    }

    function devAward() external {
        uint256 balance = address(this).balance;
        require(balance > 0, "Contract has no ETH balance.");
        address payable sender = payable(_devAddress);
        sender.transfer(balance);
    }

    function getERC721TokenCount(address contractAddress) internal view returns (uint256) {
        IERC721 erc721Contract = IERC721(contractAddress);
        return erc721Contract.balanceOf(msg.sender);
    }

    function getERC20TokenCount(address contractAddress) internal view returns (uint256) {
        IERC20 erc20Contract = IERC20(contractAddress);
        return erc20Contract.balanceOf(msg.sender);
    }

    function getERC1155TokenCount(address contractAddress, uint256 tokenId) internal view returns (uint256) {
        IERC1155 erc1155Contract = IERC1155(contractAddress);
        return erc1155Contract.balanceOf(msg.sender, tokenId);
    }

    function burn(uint256 amount) external {
        require(amount > 0, "Invalid amount");
        _burn(msg.sender, amount);
    }

}

Read Contract

_berc20EthPro 0xaeb81375 → uint256
_burnPer 0x45ba10f4 → uint256
_deplyAddress 0x7a8cf66a → address
_deplyPro 0xcccfd254 → uint256
_devAddress 0x6af65929 → address
_devPro 0x138d1844 → uint256
_maxMintCount 0x87512b94 → uint256
_maxMintPerAddress 0xcfa69a53 → uint256
_maxPro 0x367d1ea2 → uint256
_mintCounts 0xd3bfe4d3 → uint256
_mintPrice 0x0387da42 → uint256
_mintedCounts 0xa61c6d2a → uint256
_vitalikAddress 0x3d96ecbb → address
_vitalikPro 0x65f9bec2 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
contractAuths 0x510ea096 → uint8, address, uint256
decimals 0x313ce567 → uint8
lpContract 0x8acee3cf → address
mintEndTime 0x717a002b → uint256
mintStartTime 0x931e2e49 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
wethAddress 0x4f0e0ef3 → address

Write Contract 13 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burn 0x42966c68
uint256 amount
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
devAward 0x859c2af1
No parameters
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
mint 0x94bf804d
uint256 mintCount
address receiveAds
renounceOwnership 0x715018a6
No parameters
setBerc20EthPro 0x8b69d7fd
uint256 ethPro
setContractAuth 0xbc75cac8
uint256[] params
address[] authContracts
setLPContract 0x9bb90794
address lp
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address