Address Contract Partially Verified
Address
0x20398aD62bb2D930646d45a6D4292baa0b860C1f
Balance
0 ETH
Nonce
1
Code Size
3986 bytes
Creator
0x2f4623d6...E388 at tx 0xd942186f...b88ecd
Indexed Transactions
0
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