// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; /// TEST-ONLY mock (local hardhat — NEVER deploy to chain 2800): ERC20 with /// configurable decimals + a per-recipient blocklist that makes transfer() /// RETURN FALSE (no revert). Exercises AereCoreBookV0's push-to-claimable /// fallback (_payOrCredit, AUDIT FIX R5 MED-8) and the claim(bool) pull path, /// which plain mocks can never trigger because their transfers always succeed. contract MockERC20Blocking is ERC20 { uint8 private immutable _dec; mapping(address => bool) public blocked; constructor(string memory n, string memory s, uint8 d) ERC20(n, s) { _dec = d; } function decimals() public view override returns (uint8) { return _dec; } function mint(address to, uint256 amt) external { _mint(to, amt); } function setBlocked(address who, bool isBlocked) external { blocked[who] = isBlocked; } function transfer(address to, uint256 amount) public override returns (bool) { if (blocked[to]) return false; return super.transfer(to, amount); } }