# Module transactions will always fail because incompatible with Safe 1.5.0

Brahma's SafeModerator guard implements checkModuleTransaction without the bytes32 return that Safe 1.4.0+ expects, so all module transactions revert.

- Payout: Audit contest
- Severity: medium
- Program: Brahma
- Found by: T1MOH
- Disclosed: 2023-11-21
- Write-up quality: 6/10
- Original: https://code4rena.com/reports/2023-10-brahma#m-04
- Library page: https://bugbountylibrary.com/r/c4%3A2023-10-brahma%3AM-04
- Tags: area:web3 domain:web3 impact:dos kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:regression technique:source-review vuln:accounting-error

**Target:** SafeModerator / SafeModeratorOverridable guard contracts on Gnosis Safe modules
**Root cause:** IGuard.checkModuleTransaction is declared with no return value, but Gnosis Safe 1.4.0+ ModuleManager.execTransactionFromModule expects a bytes32 guardHash return; ABI-decoding the empty return reverts.
**Steps:**
1. Enable SafeModerator as guard on a Gnosis Safe >=1.4.0 with an enabled module.
2. Call `execTransactionFromModule(to, value, data, operation)` from the module.
3. ModuleManager calls `guard.checkModuleTransaction(...)` and assigns result to `bytes32 guardHash`.
4. Guard returns no data; decoding into bytes32 reverts, so the module tx always fails.
**How found:** Read the Safe 1.5.0 ModuleManager source and noticed the guard callback return value, then compared against Brahma's IGuard interface which lacked the return type; confirmed with a minimal Remix PoC.
**Insight:** When integrating with an external contract's callback interface, diff the exact function signature (including return types) against the target version's source, not just the parameter list; a missing return type silently reverts on ABI decode.

