<!-- canonical: https://0xsimao.com/findings/m-0-implementation-quorum-incompatible-tally -->

# StandardGovernor's implementation of quorum is incompatible with Tally

Low/Info · Three Sigma · Stablecoin framework · 8th January, 2024

Finding 3S-M^0-L10 of the M^0 Minter Gateway security review.

- Protocol: https://www.m0.org/
- Report: /reports/m-0
- Codebase: https://github.com/0xsimao/ttg/tree/a8127901fa1f24a2e821cf4d9854a1aa6ac8088c
- Source: https://cdn.sanity.io/files/qoqld077/production/1cdafafad874aba76e062ad8c216c98338c096db.pdf

---

### Description

The [StandardGovernor](https://github.com/MZero-Labs/ttg/blob/a8127901fa1f24a2e821cf4d9854a1aa6ac8088c/src/StandardGovernor.sol) contract inherits from IGovernor, which states the following:

```solidity
/// @title Minimal OpenZeppelin-style, Tally-compatible governor. interface IGovernor is IERC6372, IERC712 {
```

But the StandardGovernor contract implements quorum functions in the following way:

```solidity
/// @inheritdoc IGovernor
function quorum() external pure returns (uint256) {
    return 0;
}
/// @inheritdoc IGovernor
function quorum(uint256) external pure returns (uint256) {
    return 0;
}
```

The [documentation](https://docs.tally.xyz/user-guides/tally-contract-compatibility/openzeppelin-governor#quorum) from Tally states that it "needs the quorum to calculate if a proposal
has passed." Returning quorum as zero, even though that's not the quorum threshold's
value, will not only break some compatibility with Tally, but it also might bring about
unexpected outputs to other smart contracts within the Ethereum ecosystem expecting
the StandardGovernor to follow full Tally compatibility, as stated in IGovernor, thus
breaking modularity.

### Recommendation

Consider properly implementing the quorum functions. Optionally, be explicit about this lack
of compatibility.

### Status

Addressed in [#235](https://github.com/MZero-Labs/ttg/pull/235).
