Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x9AfC975EdB8a0B57f066e8e0A72A5e2ADbdCb605
Balance 0 ETH
Nonce 1
Code Size 4049 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

4049 bytes
0x608060405234801561000f575f80fd5b5060043610610106575f3560e01c806370a082311161009e578063a9059cbb1161006e578063a9059cbb14610233578063be45fd6214610246578063c45a015514610259578063d5abeb011461026c578063dd62ed3e14610275575f80fd5b806370a08231146101dd57806388e2a0e01461020557806395d89b41146102185780639dc29fac14610220575f80fd5b8063313ce567116100d9578063313ce567146101705780633d11d0951461018557806340c10f191461019a5780636347f70e146101ad575f80fd5b806306fdde031461010a578063095ea7b31461012857806318160ddd1461014b57806323b872dd1461015d575b5f80fd5b6101126102ad565b60405161011f9190610ced565b60405180910390f35b61013b610136366004610d54565b61033d565b604051901515815260200161011f565b6002545b60405190815260200161011f565b61013b61016b366004610d7c565b610356565b60055460405160ff909116815260200161011f565b610198610193366004610db5565b610379565b005b6101986101a8366004610d54565b6103e8565b6005546101c59061010090046001600160a01b031681565b6040516001600160a01b03909116815260200161011f565b61014f6101eb366004610de8565b6001600160a01b03165f9081526020819052604090205490565b610198610213366004610de8565b6104f5565b6101126105a5565b61019861022e366004610d54565b6105b4565b61013b610241366004610d54565b610645565b61013b610254366004610e08565b610652565b6006546101c5906001600160a01b031681565b61014f60075481565b61014f610283366004610e88565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546102bc90610eb9565b80601f01602080910402602001604051908101604052809291908181526020018280546102e890610eb9565b80156103335780601f1061030a57610100808354040283529160200191610333565b820191905f5260205f20905b81548152906001019060200180831161031657829003601f168201915b5050505050905090565b5f3361034a8185856106ba565b60019150505b92915050565b5f336103638582856106c7565b61036e858585610742565b506001949350505050565b6006546001600160a01b031633146103cf5760405162461bcd60e51b8152602060048201526014602482015273546f6b656e3a204f6e6c7920666163746f72792160601b60448201526064015b60405180910390fd5b6005805460ff191660ff92909216919091179055600755565b60065460405163b429afeb60e01b81523360048201819052916001600160a01b03169063b429afeb90602401602060405180830381865afa15801561042f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104539190610ef1565b61046f5760405162461bcd60e51b81526004016103c690610f10565b600754156104e6576007548261048460025490565b61048e9190610f47565b11156104e65760405162461bcd60e51b815260206004820152602160248201527f546f6b656e3a20657863656564656420746865206d6178696d756d2076616c756044820152606560f81b60648201526084016103c6565b6104f083836107b5565b505050565b60065460405163b429afeb60e01b81523360048201819052916001600160a01b03169063b429afeb90602401602060405180830381865afa15801561053c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105609190610ef1565b61057c5760405162461bcd60e51b81526004016103c690610f10565b50600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6060600480546102bc90610eb9565b60065460405163b429afeb60e01b81523360048201819052916001600160a01b03169063b429afeb90602401602060405180830381865afa1580156105fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061061f9190610ef1565b61063b5760405162461bcd60e51b81526004016103c690610f10565b6104f083836107ed565b5f3361034a818585610742565b5f3361065f818787610742565b856001600160a01b0316336001600160a01b03167faba420c672cff09b3d4d3feaede58151bcabe691f476793d76979583dd5dcfaf8787876040516106a693929190610f66565b60405180910390a350600195945050505050565b6104f08383836001610821565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461073c578181101561072e57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016103c6565b61073c84848484035f610821565b50505050565b6001600160a01b03831661076b57604051634b637e8f60e11b81525f60048201526024016103c6565b6001600160a01b0382166107945760405163ec442f0560e01b81525f60048201526024016103c6565b61079f8383836108f3565b6107aa838383610b3d565b6104f0838383610c63565b6001600160a01b0382166107de5760405163ec442f0560e01b81525f60048201526024016103c6565b6107e95f8383610b3d565b5050565b6001600160a01b03821661081657604051634b637e8f60e11b81525f60048201526024016103c6565b6107e9825f83610b3d565b6001600160a01b03841661084a5760405163e602df0560e01b81525f60048201526024016103c6565b6001600160a01b03831661087357604051634a1406b160e11b81525f60048201526024016103c6565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561073c57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108e591815260200190565b60405180910390a350505050565b600654604051635b14f18360e01b81523060048201525f916001600160a01b031690635b14f18390602401602060405180830381865afa158015610939573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095d9190610ef1565b600654604051634362c69f60e11b81523060048201526001600160a01b0387811660248301529293505f92909116906386c58d3e90604401602060405180830381865afa1580156109b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d49190610ef1565b600654604051634362c69f60e11b81523060048201526001600160a01b0387811660248301529293505f92909116906386c58d3e90604401602060405180830381865afa158015610a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4b9190610ef1565b905082158015610a59575081155b8015610a63575080155b610aaf5760405162461bcd60e51b815260206004820181905260248201527f546f6b656e3a20746f6b656e207472616e73666572206e6f7420616c6c6f772160448201526064016103c6565b60055461010090046001600160a01b031615610b35576005546040516321144c6f60e21b81526001600160a01b0388811660048301528781166024830152604482018790526101009092049091169063845131bc906064015f604051808303815f87803b158015610b1e575f80fd5b505af1158015610b30573d5f803e3d5ffd5b505050505b505050505050565b6001600160a01b038316610b67578060025f828254610b5c9190610f47565b90915550610bd79050565b6001600160a01b0383165f9081526020819052604090205481811015610bb95760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016103c6565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610bf357600280548290039055610c11565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c5691815260200190565b60405180910390a3505050565b60055461010090046001600160a01b0316156104f057600554604051630313713f60e61b81526001600160a01b0385811660048301528481166024830152604482018490526101009092049091169063c4dc4fc0906064015f604051808303815f87803b158015610cd2575f80fd5b505af1158015610ce4573d5f803e3d5ffd5b50505050505050565b5f602080835283518060208501525f5b81811015610d1957858101830151858201604001528201610cfd565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d4f575f80fd5b919050565b5f8060408385031215610d65575f80fd5b610d6e83610d39565b946020939093013593505050565b5f805f60608486031215610d8e575f80fd5b610d9784610d39565b9250610da560208501610d39565b9150604084013590509250925092565b5f8060408385031215610dc6575f80fd5b82359150602083013560ff81168114610ddd575f80fd5b809150509250929050565b5f60208284031215610df8575f80fd5b610e0182610d39565b9392505050565b5f805f8060608587031215610e1b575f80fd5b610e2485610d39565b935060208501359250604085013567ffffffffffffffff80821115610e47575f80fd5b818701915087601f830112610e5a575f80fd5b813581811115610e68575f80fd5b886020828501011115610e79575f80fd5b95989497505060200194505050565b5f8060408385031215610e99575f80fd5b610ea283610d39565b9150610eb060208401610d39565b90509250929050565b600181811c90821680610ecd57607f821691505b602082108103610eeb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215610f01575f80fd5b81518015158114610e01575f80fd5b60208082526017908201527f546f6b656e3a204f6e6c7920436f6e74726f6c6c657221000000000000000000604082015260600190565b8082018082111561035057634e487b7160e01b5f52601160045260245ffd5b83815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f191601019291505056fea2646970667358221220fbb0839c57f5351d150779b61b88b8008a1e4037cc5e88afef67f7148b81bdff64736f6c63430008180033

Verified Source Code Partial Match

Compiler: v0.8.24+commit.e11b9ed9 EVM: shanghai Optimization: Yes (200 runs)
Token.sol 332 lines
//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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);
}
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;
    }
}
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 {
    event DataDelivery(address indexed _from, address indexed _to, uint256 _value, bytes data);
    mapping(address account => uint256) private _balances;
    mapping(address account => mapping(address spender => 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 owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }
    function transfer(address to, uint256 value, bytes calldata _data) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        emit DataDelivery(msg.sender, to, value, _data);
        return true;
    }
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _tokenTransferBefore(from, to, value);
        _update(from, to, value);
        _tokenTransferAfter(from, to, value);
    }
    function _tokenTransferBefore(address _from, address _to, uint256 value) internal virtual  {}
    function _tokenTransferAfter(address _from, address _to, uint256 value) internal virtual {}

    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

interface IToken{
    function mint(address _to, uint256 _value)external;
    function burn(address _from, uint256 _value)external;
}
interface ITokenTransferCallBack{
    function tokenTransferBefore(address, address, uint256)external;
    function tokenTransferAfter(address, address, uint256)external;
}
contract Token is ERC20, IToken {
    uint8 private decimals_;
    address public callBack;
    address public factory;
    uint256 public maxSupply;

    modifier onlyFactory{
        require(msg.sender == factory, "Token: Only factory!");
        _;
    }
    modifier onlyController(address _account){
       require(IFactory(factory).isController(_account), "Token: Only Controller!");
       _;
    }

    constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol){
        factory = msg.sender;
    }

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

    function initialize(uint256 _maxSupply, uint8 _decimals) external onlyFactory {
        decimals_ = _decimals;
        maxSupply = _maxSupply;
    }
    function _tokenTransferBefore(address _from,  address _to, uint256 _value) internal override   {
        bool _tokenPaused = IFactory(factory).isPaused(address(this));
        bool _blockedFrom = IFactory(factory).isBlocked(address(this), _from);
        bool _blockedTo = IFactory(factory).isBlocked(address(this), _to);
        require(
            _tokenPaused == false 
            && _blockedFrom == false
            && _blockedTo   == false,
            "Token: token transfer not allow!"
        );
         if(callBack != address(0)) {
            ITokenTransferCallBack(callBack).tokenTransferBefore(_from, _to, _value);
         }
    }
    function _tokenTransferAfter(address _from,  address _to, uint256 _value) internal override  {
        if(callBack != address(0)) {
          ITokenTransferCallBack(callBack).tokenTransferAfter(_from, _to, _value);
        }
    }

    function mint(address _to, uint256 _value) external override onlyController(msg.sender) {
        if(maxSupply !=0) {
           require(totalSupply() + _value <= maxSupply, "Token: exceeded the maximum value");
        }
        _mint(_to, _value);
    }
    function burn(address _from, uint256 _value) external override onlyController(msg.sender) {
        _burn(_from, _value);
    }
    function setCallBack(address _callBack) external onlyController(msg.sender) {
        callBack = _callBack;
    }
}

interface IFactory{
    function isController(address _controller) external view returns(bool);
    function isBlocked(address _token, address _account) external view returns(bool);
    function isPaused(address _token)  external view returns(bool);
    function owner() external view returns(address);
    function createToken(string memory _name, string memory _symbol, uint8 _decimals, uint256 _maxSupply) external returns(address);
}

contract Factory is IFactory{
    event TokenCreated(
         address indexed _token
    );

    address public owner;
    address[] public tokens;

    mapping (address => string) public tokenSymbol; // address => symbol
    mapping (bytes => address) public tokenAddress; // symbol => address

    mapping (address => bool) public allTokenBlocked; // account => isBlocked
    mapping (address => mapping (address=> bool) ) public singleTokenBlocked;

    mapping (address => bool) public tokenControllers;  // allTokenController => isController;

    bool public allTokenPaused;
    mapping (address=>bool) public singleTokenPaused;

    modifier onlyOwnerOrTokenController{
        require(msg.sender == owner || tokenControllers[msg.sender], "Factory: Only owner or controller!");
        _;
    }
    modifier onlyOwner{
        require(msg.sender == owner, "Factory: Only owner!");
        _;
    }
    constructor(address _owner){
        owner = _owner;
    }

    function tokenAddressByName(string memory _symbol, string memory _name ) public view returns(address){
        bytes memory symbol_name = abi.encodePacked(_symbol, _name);
        return tokenAddress[symbol_name];
    }

    function isController(address _controller) public override view returns(bool) {
        return tokenControllers[_controller];
    }

    function isBlocked(address _token, address _account)  public override view returns(bool) {
        return singleTokenBlocked[_token][_account] || allTokenBlocked[_account];
    }

    function isPaused(address _token)  public override view returns(bool){
        return singleTokenPaused[_token] || allTokenPaused;
    }

    function createToken(string memory _name, string memory _symbol, uint8 _decimals, uint256 _maxSupply) public onlyOwnerOrTokenController returns(address) {
        bytes memory symbol_name = bytes(abi.encodePacked(_symbol, _name));
        require(tokenAddress[symbol_name]  == address(0), "Factory: Token created");
        Token token = new Token(_name, _symbol);
        token.initialize(_maxSupply, _decimals);
        tokens.push(address(token));
        tokenSymbol[address(token)] = _symbol;
        tokenAddress[symbol_name] = address(token);
        emit TokenCreated(address(token));
        return address(token);
    }

    function setBlock(address _token, address _account, bool _block) public {
        require(tokenControllers[msg.sender], "Factory: Only all token controller!");
        if(_token == address(0)) { // block all token
            allTokenBlocked[_account] = _block;
        }else {
            singleTokenBlocked[_token][_account] = _block;
        }
    }
    function pauseToken(address _token, bool _pause) public {
        require(tokenControllers[msg.sender], "Factory: Only all token controller!");
        if(_token == address(0)) {
            allTokenPaused = _pause;
        }else{
            singleTokenPaused[_token] = _pause;
        }
    }
    function setController(address _account, bool _isController) onlyOwner public{
        tokenControllers[_account] = _isController;
    }
    function transferOwnerShip(address _newOwner) onlyOwner public {
        owner = _newOwner;
    }
}

Read Contract

allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
callBack 0x6347f70e → address
decimals 0x313ce567 → uint8
factory 0xc45a0155 → address
maxSupply 0xd5abeb01 → uint256
name 0x06fdde03 → string
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 8 functions

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

approve 0x095ea7b3
address spender
uint256 value
returns: bool
burn 0x9dc29fac
address _from
uint256 _value
initialize 0x3d11d095
uint256 _maxSupply
uint8 _decimals
mint 0x40c10f19
address _to
uint256 _value
setCallBack 0x88e2a0e0
address _callBack
transfer 0xa9059cbb
address to
uint256 value
returns: bool
transfer 0xbe45fd62
address to
uint256 value
bytes _data
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 value
returns: bool

Recent Transactions

No transactions found for this address