diff --git a/src/Erc20.sol b/src/Erc20.sol new file mode 100644 index 0000000..d37898b --- /dev/null +++ b/src/Erc20.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +/// @title Minimal, correct ERC20 base shared by the LP token and test tokens. +contract Erc20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + string public name; + string public symbol; + uint8 public constant decimals = 18; + + uint256 public totalSupply; + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + constructor(string memory tokenName, string memory tokenSymbol) { + name = tokenName; + symbol = tokenSymbol; + } + + function _mint(address to, uint256 value) internal { + totalSupply += value; + balanceOf[to] += value; + emit Transfer(address(0), to, value); + } + + function _burn(address from, uint256 value) internal { + balanceOf[from] -= value; + totalSupply -= value; + emit Transfer(from, address(0), value); + } + + function _transfer(address from, address to, uint256 value) internal { + balanceOf[from] -= value; + balanceOf[to] += value; + emit Transfer(from, to, value); + } + + function approve(address spender, uint256 value) external returns (bool) { + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + return true; + } + + function transfer(address to, uint256 value) external returns (bool) { + _transfer(msg.sender, to, value); + return true; + } + + function transferFrom(address from, address to, uint256 value) external returns (bool) { + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) { + allowance[from][msg.sender] = allowed - value; + } + _transfer(from, to, value); + return true; + } +} diff --git a/src/interfaces/IErc20.sol b/src/interfaces/IErc20.sol new file mode 100644 index 0000000..121892c --- /dev/null +++ b/src/interfaces/IErc20.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +interface IErc20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + function name() external view returns (string memory); + function symbol() external view returns (string memory); + function decimals() external view returns (uint8); + function totalSupply() external view returns (uint256); + function balanceOf(address owner) external view returns (uint256); + function allowance(address owner, address spender) external view returns (uint256); + function approve(address spender, uint256 value) external returns (bool); + function transfer(address to, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); +}