// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @notice On-chain GRU Monetary Policy mint gate (coverage, velocity zone, utilization). */ interface IGruMonetaryPolicyGate { enum VelocityZone { Green, AmberLow, AmberHigh, Red, Black } struct MetricsSnapshot { uint256 coverageRatioBps; uint256 m1ToM00Utilization; // whole number ratio numerator (e.g. 25 = 25:1) VelocityZone velocityZone; uint256 metricsUpdatedAt; bool issuancePaused; } event MetricsUpdated(uint256 coverageRatioBps, uint256 m1ToM00Utilization, VelocityZone zone, bool issuancePaused); event PolicyGateSet(address indexed token, bool enabled); function metrics() external view returns (MetricsSnapshot memory); function tokenGateEnabled(address token) external view returns (bool); function setTokenGate(address token, bool enabled) external; function updateMetrics( uint256 coverageRatioBps, uint256 m1ToM00Utilization, VelocityZone zone, bool issuancePaused ) external; function canMint(address token, uint256 amount) external view returns (bool); function canMintReason(address token, uint256 amount) external view returns (bool ok, bytes32 reason); }