A multisig wallet should not be able to execute arbitrary calls back into itself. Self‑calls can change how msg.sender is perceived (becoming the contract address), complicate access control assumptions, and expand the reentrancy surface.
he contract permits transactions where to == address(this). During execution, it performs a low‑level .call() with arbitrary data, allowing self‑calls. While many external functions are guarded (onlyOwner, onlyRole(SIGNING_ROLE), and nonReentrant), the lack of a hard prohibition on self‑calls creates pathways for misuse:
If the contract address is ever (accidentally) granted SIGNING_ROLE, self‑invoked calls would see msg.sender == address(this) and pass role checks.
Future code changes (e.g., adding an unguarded external function or removing nonReentrant) could immediately make self‑calls a privilege escalation vector.
Even today, self‑calls can be used for gas griefing or unexpected control flow (e.g., triggering receive() with large value and data paths), increasing operational risk.
Likelihood: Medium
During routine operations, admins may mistakenly grant SIGNING_ROLE to the contract address (allowed by grantSigningRole), or future refactors may add new external functions without proper guards - both make self‑calls plausible and dangerous.
Teams often craft complex data payloads; allowing self‑targeting increases the chance of unexpected interactions and reentrancy‑adjacent behaviors.
Impact: Medium
Privilege escalation & state manipulation: If the contract address holds a privileged role (or a new unguarded function is introduced), a self‑call can grant/revoke roles, propose, confirm, or execute transactions without the intended human gatekeeping.
Operational instability: Self‑calls enlarge the attack surface for griefing/DoS, confuse monitoring (events look like internal activity), and undermine the clarity of who initiated sensitive changes.
Copy the code below to MultiSigTimeLockTest.t.sol.
Run command forge test --mt testSelfCallIsAcceptedAndExecutable -vvvv.
Output:
Explicitly forbid self‑calls and prevent assigning roles to the contract address:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.