Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x20398aD62bb2D930646d45a6D4292baa0b860C1f
Balance 0 ETH
Nonce 1
Code Size 3986 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

3986 bytes
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637ecebe00116100b8578063c2801bbf1161007c578063c2801bbf1461036c578063d505accf14610374578063dd62ed3e146103c7578063e3ee160e146103f5578063e94a010214610454578063ed24911d1461048057610137565b80637ecebe00146102e657806395d89b411461030c578063a0cc6a6814610314578063a7f0e9031461031c578063a9059cbb1461034057610137565b8063313ce567116100ff578063313ce567146102515780633408e4701461026f57806340c10f191461027757806342966c68146102a357806370a08231146102c057610137565b806306fdde031461013c578063095ea7b3146101b957806318160ddd146101f957806323b872dd1461021357806330adf81f14610249575b600080fd5b610144610488565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b0381351690602001356104ae565b604080519115158252519081900360200190f35b6102016104c5565b60408051918252519081900360200190f35b6101e56004803603606081101561022957600080fd5b506001600160a01b038135811691602081013590911690604001356104cb565b61020161053d565b610259610561565b6040805160ff9092168252519081900360200190f35b610201610566565b6101e56004803603604081101561028d57600080fd5b506001600160a01b03813516906020013561056a565b6101e5600480360360208110156102b957600080fd5b50356105fc565b610201600480360360208110156102d657600080fd5b50356001600160a01b0316610610565b610201600480360360208110156102fc57600080fd5b50356001600160a01b0316610622565b610144610634565b610201610655565b610324610679565b604080516001600160a01b039092168252519081900360200190f35b6101e56004803603604081101561035657600080fd5b506001600160a01b038135169060200135610691565b61032461069e565b6103c5600480360360e081101561038a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356106b6565b005b610201600480360360408110156103dd57600080fd5b506001600160a01b03813581169160200135166107d7565b6103c5600480360361012081101561040c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356107f4565b6101e56004803603604081101561046a57600080fd5b506001600160a01b038135169060200135610a04565b610201610a24565b6040518060400160405280600a815260200169466c6173687374616b6560b01b81525081565b60006104bb338484610b2e565b5060015b92915050565b60005481565b6001600160a01b03831660009081526002602090815260408083203384529091528120546000198114610527576105028184610b90565b6001600160a01b03861660009081526002602090815260408083203384529091529020555b610532858585610bdd565b506001949350505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b4690565b6000337315eb0c763581329c921c8398556ecff85cc4827514806105a157503373f2319b6d2ab252d8d80d8cec34daf0079222a624145b6105f2576040805162461bcd60e51b815260206004820152601760248201527f466c617368546f6b656e3a3a204e4f545f4d494e544552000000000000000000604482015290519081900360640190fd5b6104bb8383610ce7565b60006106083383610d71565b506001919050565b60016020526000908152604090205481565b60036020526000908152604090205481565b6040518060400160405280600581526020016408c9882a6960db1b81525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b7315eb0c763581329c921c8398556ecff85cc4827581565b60006104bb338484610bdd565b73f2319b6d2ab252d8d80d8cec34daf0079222a62481565b42841015610707576040805162461bcd60e51b8152602060048201526019602482015278119b185cda151bdad95b8e8e881055551217d1561412549151603a1b604482015290519081900360640190fd5b6001600160a01b0380881660008181526003602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968d166060880152608087018c905260a0870181905260c08088018c90528251808903909101815260e09097019091528551958201959095209390925290529061079c906001610ae2565b6001600160a01b0389166000908152600360205260409020556107c28882868686610e03565b6107cd888888610b2e565b5050505050505050565b600260209081526000928352604080842090915290825290205481565b854211610848576040805162461bcd60e51b815260206004820152601f60248201527f466c617368546f6b656e3a3a20415554485f4e4f545f5945545f56414c494400604482015290519081900360640190fd5b844210610898576040805162461bcd60e51b8152602060048201526019602482015278119b185cda151bdad95b8e8e881055551217d1561412549151603a1b604482015290519081900360640190fd5b6001600160a01b038916600090815260046020908152604080832087845290915290205460ff1615610911576040805162461bcd60e51b815260206004820152601e60248201527f466c617368546f6b656e3a3a20415554485f414c52454144595f555345440000604482015290519081900360640190fd5b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a22676020808301919091526001600160a01b03808d16838501528b166060830152608082018a905260a0820189905260c0820188905260e08083018890528351808403909101815261010090920190925280519101206109978a82868686610e03565b6001600160a01b038a166000818152600460209081526040808320898452909152808220805460ff19166001179055518792917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a36109f88a8a8a610bdd565b50505050505050505050565b600460209081526000928352604080842090915290825290205460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f345b72c36b14f1cee01efb8ac4b299dc7b8d873e28b4796034548a3d371a4d2f7fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5610a91610566565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b808201828110156104bf576040805162461bcd60e51b81526020600482015260116024820152704d4154483a4144445f4f564552464c4f5760781b604482015290519081900360640190fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b808203828111156104bf576040805162461bcd60e51b81526020600482015260126024820152714d4154483a5355425f554e444552464c4f5760701b604482015290519081900360640190fd5b6001600160a01b0382163014801590610bfe57506001600160a01b03821615155b610c395760405162461bcd60e51b8152600401808060200182810382526026815260200180610f376026913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054610c5c9082610b90565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610c8b9082610ae2565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600054610cf49082610ae2565b60009081556001600160a01b038316815260016020526040902054610d199082610ae2565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216600090815260016020526040902054610d949082610b90565b6001600160a01b03831660009081526001602052604081209190915554610dbb9082610b90565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6000610e0d610a24565b85604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ea6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610edc5750866001600160a01b0316816001600160a01b0316145b610f2d576040805162461bcd60e51b815260206004820152601e60248201527f466c617368546f6b656e3a3a20494e56414c49445f5349474e41545552450000604482015290519081900360640190fd5b5050505050505056fe466c617368546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524fa2646970667358221220f14349afdcfe5cd69f9a2bca6a00f48e2476ec348bc7f4ab487e027223cec45264736f6c63430007040033

Verified Source Code Partial Match

Compiler: v0.7.4+commit.3f05b770 EVM: istanbul Optimization: Yes (200 runs)
FlashToken.sol 224 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.7.4;

library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "MATH:ADD_OVERFLOW");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "MATH:SUB_UNDERFLOW");
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

// Lightweight token modelled after UNI-LP:
// https://github.com/Uniswap/uniswap-v2-core/blob/v1.0.1/contracts/UniswapV2ERC20.sol
// Adds:
//   - An exposed `mint()` with minting role
//   - An exposed `burn()`
//   - ERC-3009 (`transferWithAuthorization()`)
contract FlashToken is IERC20 {
    using SafeMath for uint256;

    // bytes32 private constant EIP712DOMAIN_HASH =
    // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
    bytes32 private constant EIP712DOMAIN_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    // bytes32 private constant NAME_HASH = keccak256("FLASH")
    bytes32 private constant NAME_HASH = 0x345b72c36b14f1cee01efb8ac4b299dc7b8d873e28b4796034548a3d371a4d2f;

    // bytes32 private constant VERSION_HASH = keccak256("2")
    bytes32 private constant VERSION_HASH = 0xad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5;

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

    // bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH =
    // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)");
    bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267;

    string public constant name = "Flashstake";
    string public constant symbol = "FLASH";
    uint8 public constant decimals = 18;

    address public constant FLASH_PROTOCOL = 0x15EB0c763581329C921C8398556EcFf85Cc48275;
    address public constant FLASH_CLAIM = 0xf2319b6D2aB252d8D80D8CEC34DaF0079222A624;

    uint256 public override totalSupply;

    mapping(address => uint256) public override balanceOf;
    mapping(address => mapping(address => uint256)) public override allowance;

    // ERC-2612, ERC-3009 state
    mapping(address => uint256) public nonces;
    mapping(address => mapping(bytes32 => bool)) public authorizationState;

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce);

    modifier onlyMinter {
        require(msg.sender == FLASH_PROTOCOL || msg.sender == FLASH_CLAIM, "FlashToken:: NOT_MINTER");
        _;
    }

    constructor() {
        // BlockZero Labs: Foundation Fund
        _mint(0x842f8f6fB524996d0b660621DA895166E1ceA691, 1200746000000000000000000);
        _mint(0x0945d9033147F27aDDFd3e7532ECD2100cb91032, 1000000000000000000000000);
    }

    function _validateSignedData(
        address signer,
        bytes32 encodeData,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal view {
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", getDomainSeparator(), encodeData));
        address recoveredAddress = ecrecover(digest, v, r, s);
        // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages
        require(recoveredAddress != address(0) && recoveredAddress == signer, "FlashToken:: INVALID_SIGNATURE");
    }

    function _mint(address to, uint256 value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        // Balance is implicitly checked with SafeMath's underflow protection
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(
        address owner,
        address spender,
        uint256 value
    ) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) private {
        require(to != address(this) && to != address(0), "FlashToken:: RECEIVER_IS_TOKEN_OR_ZERO");

        // Balance is implicitly checked with SafeMath's underflow protection
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function getChainId() public pure returns (uint256 chainId) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            chainId := chainid()
        }
    }

    function getDomainSeparator() public view returns (bytes32) {
        return keccak256(abi.encode(EIP712DOMAIN_HASH, NAME_HASH, VERSION_HASH, getChainId(), address(this)));
    }

    function mint(address to, uint256 value) external onlyMinter returns (bool) {
        _mint(to, value);
        return true;
    }

    function burn(uint256 value) external returns (bool) {
        _burn(msg.sender, value);
        return true;
    }

    function approve(address spender, uint256 value) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint256 value) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override returns (bool) {
        uint256 fromAllowance = allowance[from][msg.sender];
        if (fromAllowance != uint256(-1)) {
            // Allowance is implicitly checked with SafeMath's underflow protection
            allowance[from][msg.sender] = fromAllowance.sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(deadline >= block.timestamp, "FlashToken:: AUTH_EXPIRED");

        bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner], deadline));
        nonces[owner] = nonces[owner].add(1);
        _validateSignedData(owner, encodeData, v, r, s);

        _approve(owner, spender, value);
    }

    function transferWithAuthorization(
        address from,
        address to,
        uint256 value,
        uint256 validAfter,
        uint256 validBefore,
        bytes32 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(block.timestamp > validAfter, "FlashToken:: AUTH_NOT_YET_VALID");
        require(block.timestamp < validBefore, "FlashToken:: AUTH_EXPIRED");
        require(!authorizationState[from][nonce], "FlashToken:: AUTH_ALREADY_USED");

        bytes32 encodeData = keccak256(abi.encode(TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce));
        _validateSignedData(from, encodeData, v, r, s);

        authorizationState[from][nonce] = true;
        emit AuthorizationUsed(from, nonce);

        _transfer(from, to, value);
    }
}

Read Contract

FLASH_CLAIM 0xc2801bbf → address
FLASH_PROTOCOL 0xa7f0e903 → address
PERMIT_TYPEHASH 0x30adf81f → bytes32
TRANSFER_WITH_AUTHORIZATION_TYPEHASH 0xa0cc6a68 → bytes32
allowance 0xdd62ed3e → uint256
authorizationState 0xe94a0102 → bool
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
getChainId 0x3408e470 → uint256
getDomainSeparator 0xed24911d → bytes32
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 7 functions

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

approve 0x095ea7b3
address spender
uint256 value
returns: bool
burn 0x42966c68
uint256 value
returns: bool
mint 0x40c10f19
address to
uint256 value
returns: bool
permit 0xd505accf
address owner
address spender
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
transfer 0xa9059cbb
address to
uint256 value
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 value
returns: bool
transferWithAuthorization 0xe3ee160e
address from
address to
uint256 value
uint256 validAfter
uint256 validBefore
bytes32 nonce
uint8 v
bytes32 r
bytes32 s

Recent Transactions

No transactions found for this address