Description:
ERC20 token contract with Factory capabilities. Standard implementation for fungible tokens on Ethereum.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"contracts/MyToken.sol": {
"content": "// SPDX-License-Identifier: MIT
/*
???? WELCOME TO THE SISKO COIN ????
Sisko Token ($SISKO) – where the brave burn brighter.
*/
pragma solidity ^0.8.28;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Context.sol";
contract SiskoCoin is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _emberBalance;
mapping(address => mapping(address => uint256)) private _flameAllowance;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private immutable _decimals;
error BurnDenied();
error UnauthorizedFirestarter();
error InsufficientFlame();
error TryAgainAshling();
event Ignition(address indexed from, address indexed to, uint256 amount);
constructor() {
_name = "SISKOCOIN";
_symbol = "$SISKO";
_decimals = 18;
_ignite(msg.sender, 200_000_000_000 * 10**18); // 200B tokens
}
function whyDoWeBurn() external pure returns (string memory) {
return "To rise from ashes, again and again.";
}
function name() external view override returns (string memory) {
return _name;
}
function symbol() external view override returns (string memory) {
return _symbol;
}
function decimals() external view override returns (uint8) {
return _decimals;
}
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view override returns (uint256) {
return _emberBalance[account];
}
function allowance(address owner, address spender) external view override returns (uint256) {
return _flameAllowance[owner][spender];
}
function transfer(address to, uint256 amount) external override returns (bool) {
address owner = _msgSender();
_blaze(owner, to, amount);
return true;
}
function approve(address spender, uint256 amount) external override returns (bool) {
address owner = _msgSender();
_authorizeFlame(owner, spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) external override returns (bool) {
address spender = _msgSender();
_spendFlame(from, spender, amount);
_blaze(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
address owner = _msgSender();
_authorizeFlame(owner, spender, _flameAllowance[owner][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = _flameAllowance[owner][spender];
if (currentAllowance < subtractedValue) revert BurnDenied();
unchecked {
_authorizeFlame(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _blaze(address from, address to, uint256 amount) internal {
if (from == address(0)) revert UnauthorizedFirestarter();
if (to == address(0)) revert UnauthorizedFirestarter();
uint256 fromBalance = _emberBalance[from];
if (fromBalance < amount) revert InsufficientFlame();
unchecked {
_emberBalance[from] = fromBalance - amount;
_emberBalance[to] += amount;
}
emit Transfer(from, to, amount);
emit Ignition(from, to, amount);
}
function _ignite(address account, uint256 amount) internal {
if (account == address(0)) revert UnauthorizedFirestarter();
_totalSupply += amount;
unchecked {
_emberBalance[account] += amount;
}
emit Transfer(address(0), account, amount);
}
function _authorizeFlame(address owner, address spender, uint256 amount) internal {
if (owner == address(0)) revert UnauthorizedFirestarter();
if (spender == address(0)) revert UnauthorizedFirestarter();
_flameAllowance[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendFlame(address owner, address spender, uint256 amount) internal {
uint256 currentAllowance = _flameAllowance[owner][spender];
if (currentAllowance != type(uint256).max) {
if (currentAllowance < amount) revert TryAgainAshling();
unchecked {
_authorizeFlame(owner, spender, currentAllowance - amount);
}
}
}
}"
},
"@openzeppelin/contracts/utils/Context.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
"
},
"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
"
},
"@openzeppelin/contracts/token/ERC20/IERC20.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
"
}
},
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"remappings": [],
"evmVersion": "paris"
}
}}
Submitted on: 2025-10-16 15:00:02
Comments
Log in to comment.
No comments yet.