Address Contract Partially Verified
Address
0x3709E8615E02C15B096f8a9B460ccb8cA8194e86
Balance
0 ETH
Nonce
1
Code Size
2980 bytes
Creator
0x2Bdcb489...6DdA at tx 0x36f832ab...82fd88
Indexed Transactions
0
Contract Bytecode
2980 bytes
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80633644e5151161008c57806395d89b411161006657806395d89b4114610201578063a9059cbb14610223578063d505accf14610236578063dd62ed3e1461024b57600080fd5b80633644e5151461019a57806370a08231146101c15780637ecebe00146101e157600080fd5b806306fdde03146100d4578063095ea7b31461010c57806318160ddd1461012f57806323b872dd1461014657806330adf81f14610159578063313ce56714610180575b600080fd5b6100f66040518060400160405280600381526020016256656560e81b81525081565b6040516101039190610abb565b60405180910390f35b61011f61011a366004610a92565b610276565b6040519015158152602001610103565b61013860005481565b604051908152602001610103565b61011f6101543660046109e6565b61028c565b6101387f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610188601281565b60405160ff9091168152602001610103565b6101387fdd43c9460481c97172748a6fc28aff33d9f44bb489122ab58ba588b1162a6da281565b6101386101cf366004610993565b60016020526000908152604090205481565b6101386101ef366004610993565b60036020526000908152604090205481565b6100f66040518060400160405280600381526020016256454560e81b81525081565b61011f610231366004610a92565b610321565b610249610244366004610a21565b61032e565b005b6101386102593660046109b4565b600260209081526000928352604080842090915290825290205481565b6000610283338484610554565b50600192915050565b6001600160a01b03831660009081526002602090815260408083203384529091528120546000191461030c576001600160a01b03841660009081526002602090815260408083203384529091529020546102e7908390610b26565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b6103178484846105b6565b5060019392505050565b60006102833384846105b6565b4284101561036d5760405162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b60448201526064015b60405180910390fd5b6001600160a01b038716600090815260036020526040812080547fdd43c9460481c97172748a6fc28aff33d9f44bb489122ab58ba588b1162a6da2917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91876103db83610b3d565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161045492919061190160f01b81526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905060006104d38585856104cb866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b92919061065e565b90506001600160a01b038116158015906104fe5750886001600160a01b0316816001600160a01b0316145b61053e5760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b6044820152606401610364565b610549898989610554565b505050505050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546105da908290610b26565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461060a908290610b0e565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906105a99085815260200190565b600080600061066f87878787610686565b9150915061067c81610773565b5095945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156106bd575060009050600361076a565b8460ff16601b141580156106d557508460ff16601c14155b156106e6575060009050600461076a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561073a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166107635760006001925092505061076a565b9150600090505b94509492505050565b600081600481111561079557634e487b7160e01b600052602160045260246000fd5b141561079e5750565b60018160048111156107c057634e487b7160e01b600052602160045260246000fd5b141561080e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610364565b600281600481111561083057634e487b7160e01b600052602160045260246000fd5b141561087e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610364565b60038160048111156108a057634e487b7160e01b600052602160045260246000fd5b14156108f95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610364565b600481600481111561091b57634e487b7160e01b600052602160045260246000fd5b14156109745760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610364565b50565b80356001600160a01b038116811461098e57600080fd5b919050565b6000602082840312156109a4578081fd5b6109ad82610977565b9392505050565b600080604083850312156109c6578081fd5b6109cf83610977565b91506109dd60208401610977565b90509250929050565b6000806000606084860312156109fa578081fd5b610a0384610977565b9250610a1160208501610977565b9150604084013590509250925092565b600080600080600080600060e0888a031215610a3b578283fd5b610a4488610977565b9650610a5260208901610977565b95506040880135945060608801359350608088013560ff81168114610a75578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610aa4578182fd5b610aad83610977565b946020939093013593505050565b6000602080835283518082850152825b81811015610ae757858101830151858201604001528201610acb565b81811115610af85783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610b2157610b21610b58565b500190565b600082821015610b3857610b38610b58565b500390565b6000600019821415610b5157610b51610b58565b5060010190565b634e487b7160e01b600052601160045260246000fdfea264697066735822122042cc142700e16c16c5586054dc2e7b1dcb77f58a7bc1dbae85268fe6fc4fe4f364736f6c63430008040033
Verified Source Code Partial Match
Compiler: v0.8.4+commit.c7e474f2
EVM: istanbul
Optimization: Yes (200 runs)
Vee.sol 258 lines
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
pragma solidity ^0.8.0;
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s;
uint8 v;
assembly {
s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
v := add(shr(255, vs), 27)
}
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
pragma solidity >=0.8.0;
interface IVeeERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}
pragma solidity >=0.8.0;
contract Vee is IVeeERC20{
using ECDSA for bytes32;
string public constant override name = 'Vee';
string public constant override symbol = 'VEE';
uint8 public constant override decimals = 18;
uint public override totalSupply;
mapping(address => uint) public override balanceOf;
mapping(address => mapping(address => uint)) public override allowance;
bytes32 immutable public override DOMAIN_SEPARATOR;
bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
mapping(address => uint) public override nonces;
constructor(uint _totalSupply) {
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
keccak256(bytes(name)),
keccak256(bytes('1')),
block.chainid,
address(this)
)
);
totalSupply = 0;
_mint(msg.sender, _totalSupply);
}
function _mint(address to, uint value) internal {
totalSupply = totalSupply + value;
balanceOf[to] = balanceOf[to] + value;
emit Transfer(address(0), to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from] - value;
totalSupply = totalSupply - value;
emit Transfer(from, address(0), value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from] - value;
balanceOf[to] = balanceOf[to] + value;
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external override returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external override returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external override returns (bool) {
if (allowance[from][msg.sender] != type(uint).max) {
allowance[from][msg.sender] = allowance[from][msg.sender] - value;
}
_transfer(from, to, value);
return true;
}
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
require(deadline >= block.timestamp, 'EXPIRED');
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = digest.toEthSignedMessageHash().recover(v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, 'INVALID_SIGNATURE');
_approve(owner, spender, value);
}
}
Read Contract
DOMAIN_SEPARATOR 0x3644e515 → bytes32
PERMIT_TYPEHASH 0x30adf81f → bytes32
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
Write Contract 4 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
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
Recent Transactions
No transactions found for this address