### Task 2: Build the valueless six-decimal mock asset with TDD **Files:** - Create: `src/MockUSDC.sol` - Create: `test/MockUSDC.t.sol` **Interfaces:** - Produces `MockUSDC.mint(address,uint256)`, `decimals() == 6`, and standard ERC-20 behavior. - Consumed by the bank tests, deployment scripts, and dashboard ABI export. - [ ] Write `test/MockUSDC.t.sol` first. Cover the exact name/symbol/decimals, owner-only mint, successful mint, transfer/approve behavior inherited from ERC-20, and zero initial supply. Use `vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, stranger))` for non-owner minting. - [ ] Run the focused test and observe red: ```bash forge test --match-path test/MockUSDC.t.sol -vvv --force ``` Expected red: `src/MockUSDC.sol` is missing. - [ ] Implement only the tested contract: ```solidity /// @notice Educational mock token with no monetary value. Never use as real USDC. contract MockUSDC is ERC20, Ownable { constructor(address initialOwner) ERC20("Mock USD Coin", "mUSDC") Ownable(initialOwner) {} function decimals() public pure override returns (uint8) { return 6; } function mint(address to, uint256 amount) external onlyOwner { _mint(to, amount); } } ``` Reject a zero `initialOwner` through OpenZeppelin’s `OwnableInvalidOwner` behavior. Do not add faucet, burn, permit, blacklist, proxy, or bank-specific logic. - [ ] Run red-to-green verification: ```bash forge fmt forge test --match-path test/MockUSDC.t.sol -vvv --force ``` Expected: all mock-token tests pass. - [ ] Commit: ```bash git add src/MockUSDC.sol test/MockUSDC.t.sol git commit -m "feat: add valueless mock USDC" ``` ---