124 lines
4.1 KiB
Solidity
124 lines
4.1 KiB
Solidity
// SPDX-License-Identifier: UNLICENSED
|
|
pragma solidity ^0.8.30;
|
|
|
|
import {IERC20Errors} from "../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol";
|
|
import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
|
|
import {Context} from "../lib/openzeppelin-contracts/contracts/utils/Context.sol";
|
|
import {IERC20Metadata} from "../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
|
import {ERC20Internal} from "./ERC20Internal.sol";
|
|
|
|
// Copied from OpenZeppelin's ERC20 implementation, but split into internal and external parts
|
|
|
|
contract ERC20External is ERC20Internal, IERC20Metadata {
|
|
/**
|
|
* @dev Sets the values for {name} and {symbol}.
|
|
*
|
|
* Both values are immutable: they can only be set once during construction.
|
|
*/
|
|
constructor(string memory name_, string memory symbol_) {
|
|
_name = name_;
|
|
_symbol = symbol_;
|
|
}
|
|
|
|
|
|
/**
|
|
* @dev Returns the name of the token.
|
|
*/
|
|
function name() public view virtual returns (string memory) {
|
|
return _name;
|
|
}
|
|
|
|
/**
|
|
* @dev Returns the symbol of the token, usually a shorter version of the
|
|
* name.
|
|
*/
|
|
function symbol() public view virtual returns (string memory) {
|
|
return _symbol;
|
|
}
|
|
|
|
/**
|
|
* @dev Returns the number of decimals used to get its user representation.
|
|
* For example, if `decimals` equals `2`, a balance of `505` _tokens should
|
|
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
|
|
*
|
|
* Tokens usually opt for a value of 18, imitating the relationship between
|
|
* Ether and Wei. This is the default value returned by this function, unless
|
|
* it's overridden.
|
|
*
|
|
* NOTE: This information is only used for _display_ purposes: it in
|
|
* no way affects any of the arithmetic of the contract, including
|
|
* {IERC20-balanceOf} and {IERC20-transfer}.
|
|
*/
|
|
function decimals() public view virtual returns (uint8) {
|
|
return 18;
|
|
}
|
|
|
|
/// @inheritdoc IERC20
|
|
function totalSupply() public view virtual returns (uint256) {
|
|
return _totalSupply;
|
|
}
|
|
|
|
/// @inheritdoc IERC20
|
|
function balanceOf(address account) public view virtual returns (uint256) {
|
|
return _balances[account];
|
|
}
|
|
|
|
/**
|
|
* @dev See {IERC20-transfer}.
|
|
*
|
|
* Requirements:
|
|
*
|
|
* - `to` cannot be the zero address.
|
|
* - the caller must have a balance of at least `value`.
|
|
*/
|
|
function transfer(address to, uint256 value) public virtual returns (bool) {
|
|
address owner = _msgSender();
|
|
_transfer(owner, to, value);
|
|
return true;
|
|
}
|
|
|
|
/// @inheritdoc IERC20
|
|
function allowance(address owner, address spender) public view virtual returns (uint256) {
|
|
return _allowances[owner][spender];
|
|
}
|
|
|
|
/**
|
|
* @dev See {IERC20-approve}.
|
|
*
|
|
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
|
|
* `transferFrom`. This is semantically equivalent to an infinite approval.
|
|
*
|
|
* Requirements:
|
|
*
|
|
* - `spender` cannot be the zero address.
|
|
*/
|
|
function approve(address spender, uint256 value) public virtual returns (bool) {
|
|
address owner = _msgSender();
|
|
_approve(owner, spender, value);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @dev See {IERC20-transferFrom}.
|
|
*
|
|
* Skips emitting an {Approval} event indicating an allowance update. This is not
|
|
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
|
|
*
|
|
* NOTE: Does not update the allowance if the current allowance
|
|
* is the maximum `uint256`.
|
|
*
|
|
* Requirements:
|
|
*
|
|
* - `from` and `to` cannot be the zero address.
|
|
* - `from` must have a balance of at least `value`.
|
|
* - the caller must have allowance for ``from``'s _tokens of at least
|
|
* `value`.
|
|
*/
|
|
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
|
|
address spender = _msgSender();
|
|
_spendAllowance(from, spender, value);
|
|
_transfer(from, to, value);
|
|
return true;
|
|
}
|
|
}
|