// SPDX-License-Identifier: MIT
pragma solidity =0.8.19;
pragma abicoder v2;
/**
* @dev Context contract provides information about the current execution context.
* Useful in cases where meta-transactions are used, as it lets you access msg.sender and msg.data.
*/
abstract contract ExecutionContext {
function _currentSender() internal view virtual returns (address) {
return msg.sender;
}
function _currentData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev ERC20 Token Interface as per EIP-20.
*/
interface IERC20 {
event Transfer(address indexed sender, address indexed recipient, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
/**
* @dev ERC20 Metadata Interface extends the base ERC20 interface to include metadata functions.
*/
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
/**
* @dev Implementation of the ERC20 token with a basic minting mechanism.
*/
contract ERC20Token is ExecutionContext, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _tokenName;
string private _tokenSymbol;
/**
* @dev Sets the values for {name} and {symbol} during initialization.
*/
constructor(string memory name_, string memory symbol_) {
_tokenName = name_;
_tokenSymbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _tokenName;
}
/**
* @dev Returns the symbol of the token.
*/
function symbol() public view virtual override returns (string memory) {
return _tokenSymbol;
}
/**
* @dev Returns the number of decimals used to display token amounts.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev Returns the total supply of tokens in existence.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev Returns the token balance of the specified account.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev Transfers tokens from the caller to the recipient.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address sender = _currentSender();
_executeTransfer(sender, to, amount);
return true;
}
/**
* @dev Returns the current allowance for a spender.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev Approves a spender to transfer up to a specified amount from the caller’s account.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _currentSender();
_setAllowance(owner, spender, amount);
return true;
}
/**
* @dev Transfers tokens on behalf of another account.
*/
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _currentSender();
_updateAllowance(from, spender, amount);
_executeTransfer(from, to, amount);
return true;
}
/**
* @dev Increases the allowance granted to a spender.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _currentSender();
_setAllowance(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Decreases the allowance granted to a spender.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _currentSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_setAllowance(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves tokens from one address to another.
*/
function _executeTransfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
}
/**
* @dev Creates new tokens and assigns them to an account, increasing total supply.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
unchecked {
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
}
/**
* @dev Burns tokens from an account, reducing total supply.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets the allowance for a spender.
*/
function _setAllowance(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates the allowance of a spender.
*/
function _updateAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_setAllowance(owner, spender, currentAllowance - amount);
}
}
}
}
/**
* @dev SandBuck ERC20 token implementation.
*/
contract SandBuck is ERC20Token {
string public constant contractVersion = "7";
string public constant contractDeveloper = "SandBuck";
string public constant contractEdition = "7mil";
uint constant MAX_SUPPLY = 10_000_000 ether;
constructor() ERC20Token("SandBuck", "SB") {
_mint(msg.sender, MAX_SUPPLY);
}
}
{
"compilationTarget": {
"SandBuck.sol": "SandBuck"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDeveloper","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractEdition","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]