// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title MockERC20 * @dev Simple ERC20 token for testing the AI DeFi trading agent * Represents a stablecoin-like asset (e.g., mock USDC) */ contract MockERC20 { string public name; string public symbol; uint8 public decimals; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); event Mint(address indexed to, uint256 amount); event Burn(address indexed from, uint256 amount); constructor( string memory _name, string memory _symbol, uint8 _decimals, uint256 _initialSupply ) { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _initialSupply; balanceOf[msg.sender] = _initialSupply; emit Transfer(address(0), msg.sender, _initialSupply); } function transfer(address to, uint256 amount) external returns (bool) { require(to != address(0), "Invalid recipient"); require(balanceOf[msg.sender] >= amount, "Insufficient balance"); balanceOf[msg.sender] -= amount; balanceOf[to] += amount; emit Transfer(msg.sender, to, amount); return true; } function approve(address spender, uint256 amount) external returns (bool) { require(spender != address(0), "Invalid spender"); allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transferFrom( address from, address to, uint256 amount ) external returns (bool) { require(from != address(0), "Invalid sender"); require(to != address(0), "Invalid recipient"); require(balanceOf[from] >= amount, "Insufficient balance"); require(allowance[from][msg.sender] >= amount, "Insufficient allowance"); balanceOf[from] -= amount; balanceOf[to] += amount; allowance[from][msg.sender] -= amount; emit Transfer(from, to, amount); return true; } /** * @dev Mint new tokens (for testing/liquidity) */ function mint(address to, uint256 amount) external { require(to != address(0), "Invalid recipient"); totalSupply += amount; balanceOf[to] += amount; emit Mint(to, amount); emit Transfer(address(0), to, amount); } /** * @dev Burn tokens */ function burn(uint256 amount) external { require(balanceOf[msg.sender] >= amount, "Insufficient balance"); totalSupply -= amount; balanceOf[msg.sender] -= amount; emit Burn(msg.sender, amount); emit Transfer(msg.sender, address(0), amount); } }