From 1c93831b803ffa19075eaa2abf3acf0cfea33cb1 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Mon, 6 Feb 2023 23:12:29 +0000 Subject: [PATCH] Implement ERC20 --- src/ERC20.sol | 71 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/src/ERC20.sol b/src/ERC20.sol index 473ffab..e762261 100644 --- a/src/ERC20.sol +++ b/src/ERC20.sol @@ -4,33 +4,82 @@ pragma solidity ^0.8.17; import "./interfaces/IERC20.sol"; contract ERC20 is IERC20Metadata { - constructor (string memory name, string memory symbol) {} + mapping(address => uint256) private _balances; + address _owner; + string _name; + string _symbol; + uint256 _totalSupply; + uint8 _decimals = 18; + mapping(address => mapping(address => uint256)) _approvals; - function name() external view returns (string memory) {} + constructor(string memory newName, string memory newSymbol) { + _owner = msg.sender; + _name = newName; + _symbol = newSymbol; + } - function symbol() external view returns (string memory) {} + function name() external view returns (string memory) { + return _name; + } - function decimals() external view returns (uint8) {} + function symbol() external view returns (string memory) { + return _symbol; + } - function totalSupply() external view returns (uint256) {} + function decimals() external view returns (uint8) { + return _decimals; + } - function balanceOf(address account) external view returns (uint256) {} + function totalSupply() external view returns (uint256) { + return _totalSupply; + } - function transfer(address to, uint256 amount) external returns (bool) {} + function balanceOf(address account) external view returns (uint256) { + return _balances[account]; + } + + function transfer(address to, uint256 amount) external returns (bool) { + require(_balances[msg.sender] >= amount, "insufficient balance"); + _balances[msg.sender] -= amount; + _balances[to] += amount; + emit Transfer(msg.sender, to, amount); + return true; + } function allowance(address owner, address spender) external view returns (uint256) - {} + { + return _approvals[owner][spender]; + } - function approve(address spender, uint256 amount) external returns (bool) {} + function approve(address spender, uint256 amount) external returns (bool) { + _approvals[msg.sender][spender] += amount; + emit Approval(msg.sender, spender, amount); + return true; + } function transferFrom( address from, address to, uint256 amount - ) external returns (bool) {} + ) external returns (bool) { + require(_balances[from] >= amount, "insufficient balance"); + require( + _approvals[from][msg.sender] >= amount, + "insufficient allowance" + ); + _balances[from] -= amount; + _balances[to] += amount; + _approvals[from][msg.sender] -= amount; + emit Transfer(from, to, amount); + return true; + } - function mint(address to, uint256 amount) external {} + function mint(address to, uint256 amount) external { + require(msg.sender == _owner, "only minter can mint"); + _balances[to] += amount; + _totalSupply += amount; + } }