Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xBE819Dc859c2eBe1f15FCad08727355CE1CE8f68
Balance 0 ETH
Nonce 1
Code Size 3161 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

3161 bytes
0x608060405234801561000f575f5ffd5b5060043610610127575f3560e01c806370a08231116100a9578063bbb30c5d1161006e578063bbb30c5d146102e0578063d505accf1461030b578063dd62ed3e1461031e578063efc8f3c814610348578063f698da251461035b575f5ffd5b806370a082311461025a5780637ecebe001461027957806395d89b41146102985780639a2d47e2146102a0578063a9059cbb146102cd575f5ffd5b806330adf81f116100ef57806330adf81f146101bd578063313ce567146101e457806340c10f191461021d57806363ba94b414610232578063642d78fd14610252575f5ffd5b806306fdde031461012b578063095ea7b31461014957806318160ddd1461016c578063226990bd1461018357806323b872dd146101aa575b5f5ffd5b610133610363565b60405161014091906109f2565b60405180910390f35b61015c610157366004610a58565b6103ee565b6040519015158152602001610140565b61017560025481565b604051908152602001610140565b61013360405180604001604052806008815260200167115394d21493d55160c21b81525081565b61015c6101b8366004610a80565b61045a565b6101757f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61020b7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610140565b61023061022b366004610a58565b610547565b005b610133604051806040016040528060018152602001603160f81b81525081565b61020b601281565b610175610268366004610aba565b60036020525f908152604090205481565b610175610287366004610aba565b60096020525f908152604090205481565b6101336105c7565b6101336040518060400160405280600e81526020016d22b739b43937bab2102a37b5b2b760911b81525081565b61015c6102db366004610a58565b6105d4565b61015c6102ee366004610aba565b6001600160a01b03165f908152600a602052604090205460ff1690565b610230610319366004610ada565b61064a565b61017561032c366004610b47565b600460209081525f928352604080842090915290825290205481565b610230610356366004610b78565b61081b565b6101756108a5565b5f805461036f90610bb1565b80601f016020809104026020016040519081016040528092919081815260200182805461039b90610bb1565b80156103e65780601f106103bd576101008083540402835291602001916103e6565b820191905f5260205f20905b8154815290600101906020018083116103c957829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104489086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146104b35761048f8382610bfd565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f90815260036020526040812080548592906104da908490610bfd565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906105349087815260200190565b60405180910390a3506001949350505050565b335f908152600a602052604090205460ff1661057657604051633e34a41b60e21b815260040160405180910390fd5b6105808282610926565b604080516001600160a01b0384168152602081018390527f3f2c9d57c068687834f0de942a9babb9e5acab57d516d3480a3c16ee165a427391015b60405180910390a15050565b6001805461036f90610bb1565b335f908152600360205260408120805483919083906105f4908490610bfd565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104489086815260200190565b8342111561066b5760405163068568f360e21b815260040160405180910390fd5b6001600160a01b038781165f8181526009602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99481019490945291830194909452938a1660608201526080810189905260a081019390935260c08301879052916107029060e001604051602081830303815290604052805190602001206109ac565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561074d573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661078157604051632057875960e21b815260040160405180910390fd5b876001600160a01b0316816001600160a01b0316146107b357604051632057875960e21b815260040160405180910390fd5b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b335f908152600a602052604090205460ff1661084a57604051633e34a41b60e21b815260040160405180910390fd5b6001600160a01b0382165f818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527fd7f05487ae3002c125e5927b52b19827dd903ac7cb2e69c4f7f2fdbc17d1145c91016105bb565b5f600854461461091f5761091a600554600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b5060075490565b8060025f8282546109379190610c10565b90915550506001600160a01b0382165f9081526003602052604081208054839290610963908490610c10565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f6109b56108a5565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b602081525f82518060208401525f5b81811015610a1e5760208186018101516040868401015201610a01565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610a53575f5ffd5b919050565b5f5f60408385031215610a69575f5ffd5b610a7283610a3d565b946020939093013593505050565b5f5f5f60608486031215610a92575f5ffd5b610a9b84610a3d565b9250610aa960208501610a3d565b929592945050506040919091013590565b5f60208284031215610aca575f5ffd5b610ad382610a3d565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610af0575f5ffd5b610af988610a3d565b9650610b0760208901610a3d565b95506040880135945060608801359350608088013560ff81168114610b2a575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b58575f5ffd5b610b6183610a3d565b9150610b6f60208401610a3d565b90509250929050565b5f5f60408385031215610b89575f5ffd5b610b9283610a3d565b915060208301358015158114610ba6575f5ffd5b809150509250929050565b600181811c90821680610bc557607f821691505b602082108103610be357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561045457610454610be9565b8082018082111561045457610454610be956fea2646970667358221220bb536ed639c424609eda6ffd5e55cad1a2245adce7c8f5de59ed157621e2c85a64736f6c634300081c0033

Verified Source Code Partial Match

Compiler: v0.8.28+commit.7893614a EVM: shanghai Optimization: Yes (200 runs)
EnshroudToken.sol 335 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

/// @notice Modern, minimalist, and gas-optimized ERC20 implementation.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/tokens/ERC20/ERC20.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20/ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /// -----------------------------------------------------------------------
    /// Events
    /// -----------------------------------------------------------------------

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );

    /// -----------------------------------------------------------------------
    /// Metadata Storage
    /// -----------------------------------------------------------------------

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /// -----------------------------------------------------------------------
    /// ERC20 Storage
    /// -----------------------------------------------------------------------

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;
  
    /// -----------------------------------------------------------------------
    /// Constructor
    /// -----------------------------------------------------------------------
    
    constructor(string memory _name, string memory _symbol, uint8 _decimals) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    /// -----------------------------------------------------------------------
    /// ERC20 Logic
    /// -----------------------------------------------------------------------

    function approve(
        address spender,
        uint256 amount
    ) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max)
            allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /// -----------------------------------------------------------------------
    /// Internal Mint Logic
    /// -----------------------------------------------------------------------

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        balanceOf[to] += amount;

        emit Transfer(address(0), to, amount);
    }
}

/// @notice ERC20 + EIP-2612 implementation, including EIP712 logic.
/** @dev Solbase ERC20Permit implementation (https://github.com/Sol-DAO/solbase/blob/main/src/tokens/ERC20/extensions/ERC20Permit.sol)
 ** plus Solbase EIP712 implementation (https://github.com/Sol-DAO/solbase/blob/main/src/utils/EIP712.sol)
 ** NOTE: only difference from Solbase EIP712 is the EIP-712 domain variables are internal rather than immutable,
 ** because they are read during contract creation */

abstract contract ERC20Permit is ERC20 {
    /// -----------------------------------------------------------------------
    /// EIP-712 Domain Variables
    /// -----------------------------------------------------------------------

    /// @dev `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`.
    bytes32 internal constant DOMAIN_TYPEHASH =
        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    bytes32 internal hashedDomainName;

    bytes32 internal hashedDomainVersion;

    bytes32 internal initialDomainSeparator;

    uint256 internal initialChainId;

    /// -----------------------------------------------------------------------
    /// EIP-2612 Constants
    /// -----------------------------------------------------------------------

    /// @dev `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`.
    bytes32 public constant PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /// -----------------------------------------------------------------------
    /// EIP-2612 Storage
    /// -----------------------------------------------------------------------

    mapping(address => uint256) public nonces;

    /// -----------------------------------------------------------------------
    /// Custom Errors
    /// -----------------------------------------------------------------------

    error PermitExpired();

    error InvalidSigner();

    /// -----------------------------------------------------------------------
    /// Constructor
    /// -----------------------------------------------------------------------

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _version,
        uint8 _decimals
    ) ERC20(_name, _symbol, _decimals) {
        hashedDomainName = keccak256(bytes(_name));

        hashedDomainVersion = keccak256(bytes(_version));

        initialDomainSeparator = _computeDomainSeparator();

        initialChainId = block.chainid;
    }

    /// -----------------------------------------------------------------------
    /// EIP-2612 Logic
    /// -----------------------------------------------------------------------

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        if (block.timestamp > deadline) revert PermitExpired();

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                _computeDigest(
                    keccak256(
                        abi.encode(
                            PERMIT_TYPEHASH,
                            owner,
                            spender,
                            value,
                            nonces[owner]++,
                            deadline
                        )
                    )
                ),
                v,
                r,
                s
            );

            if (recoveredAddress == address(0)) revert InvalidSigner();

            if (recoveredAddress != owner) revert InvalidSigner();

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    /// -----------------------------------------------------------------------
    /// EIP-712 Logic
    /// -----------------------------------------------------------------------

    function domainSeparator() public view virtual returns (bytes32) {
        return
            block.chainid == initialChainId
                ? initialDomainSeparator
                : _computeDomainSeparator();
    }

    function _computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    DOMAIN_TYPEHASH,
                    hashedDomainName,
                    hashedDomainVersion,
                    block.chainid,
                    address(this)
                )
            );
    }

    function _computeDigest(
        bytes32 hashStruct
    ) internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator(), hashStruct)
            );
    }
}

/// @notice Enshroud ERC20 token contract
/// @dev mintable by isMinter role mapping; not burnable; ERC20Permit implemented
contract EnshroudToken is ERC20Permit {
    /// -----------------------------------------------------------------------
    /// ERC20 data
    /// -----------------------------------------------------------------------
    string public constant ENSHROUDTOKEN_NAME = "Enshroud Token";
    string public constant ENSHROUDTOKEN_SYMBOL = "ENSHROUD";
    string public constant ENSHROUDTOKEN_VERSION = "1";
    uint8 public constant ENSHROUDTOKEN_DECIMALS = 18;

    mapping(address => bool) private isMinter;

    /// -----------------------------------------------------------------------
    /// Errors
    /// -----------------------------------------------------------------------

    error NotMinter();

    /// -----------------------------------------------------------------------
    /// Events
    /// -----------------------------------------------------------------------

    event MinterStatusUpdated(address minter, bool status);

    event TokensMinted(address recipient, uint256 amount);

    /// -----------------------------------------------------------------------
    /// Constructor
    /// -----------------------------------------------------------------------

    /// include initial mint and isMinter status here
    /// @param _initialMinter: address initially designated as a minter, presumably deployer and/or DAO governance
    constructor(
        address _initialMinter
    )
        ERC20Permit(
            ENSHROUDTOKEN_NAME,
            ENSHROUDTOKEN_SYMBOL,
            ENSHROUDTOKEN_VERSION,
            ENSHROUDTOKEN_DECIMALS
        )
    {
        isMinter[_initialMinter] = true;
    }

    /// @notice mints '_amount' of Enshroud Token to '_addr'
    /// @param _addr address that will receive the minted $ENSHROUD tokens
    /// @param _amount amount of $ENSHROUD tokens that will be minted
    function mint(address _addr, uint256 _amount) external {
        if (!isMinter[msg.sender]) revert NotMinter();
        _mint(_addr, _amount);
        emit TokensMinted(_addr, _amount);
    }

    /// @notice updates if an address is authorized to mint tokens, by an existing minter
    /// @param _minterAddress address whose minter authorization status will be updated
    /// @param _minterStatus: updated minter authorization status
    function updateMinterStatus(
        address _minterAddress,
        bool _minterStatus
    ) external {
        if (!isMinter[msg.sender]) revert NotMinter();
        isMinter[_minterAddress] = _minterStatus;
        emit MinterStatusUpdated(_minterAddress, _minterStatus);
    }

    /// @notice returns if an address is authorized to mint tokens
    /// @param _addr queried minter address
    function getMinterStatus(address _addr) external view returns (bool) {
        return isMinter[_addr];
    }
}

Read Contract

ENSHROUDTOKEN_DECIMALS 0x642d78fd → uint8
ENSHROUDTOKEN_NAME 0x9a2d47e2 → string
ENSHROUDTOKEN_SYMBOL 0x226990bd → string
ENSHROUDTOKEN_VERSION 0x63ba94b4 → string
PERMIT_TYPEHASH 0x30adf81f → bytes32
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
domainSeparator 0xf698da25 → bytes32
getMinterStatus 0xbbb30c5d → bool
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 6 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
mint 0x40c10f19
address _addr
uint256 _amount
permit 0xd505accf
address owner
address spender
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
updateMinterStatus 0xefc8f3c8
address _minterAddress
bool _minterStatus

Recent Transactions

No transactions found for this address