Address Contract Partially Verified
Address
0xBE819Dc859c2eBe1f15FCad08727355CE1CE8f68
Balance
0 ETH
Nonce
1
Code Size
3161 bytes
Creator
0xbA776663...b1fd at tx 0x40238cce...50160e
Indexed Transactions
0
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