Under normal operation, the protocol requires a fixed minimum of REQUIRED_CONFIRMATIONS = 3 signer approvals before a transaction can be executed.
The protocol also allows the owner to revoke signing roles, reducing the total number of active signers at any time.
The issue arises because the required confirmation threshold is fixed and not validated against the current signer count, which allows the system to enter a state where new transactions can never reach quorum.
Transactions that already reached quorum before signer removal remain executable, but any transaction proposed after the signer count drops below the required confirmations becomes permanently unexecutable, causing a liveness failure.
Likelihood:
The owner can reduce the signer set at any time without restriction.
Governance changes or key rotations naturally cause signer removal during protocol operation.
Impact:
New transactions become permanently unexecutable once signer count drops below quorum.
Funds can become locked indefinitely with no recovery path.
This PoC demonstrates a permanent deadlock scenario for new transactions:
The signer count is reduced to fewer than REQUIRED_CONFIRMATIONS.
A new transaction is proposed.
All remaining signers confirm the transaction.
Execution is attempted and always fails because quorum is mathematically unreachable.
Already-confirmed transactions are not affected, but future transactions are permanently blocked.
The protocol must enforce that the signer count can never fall below the required quorum, or dynamically adapt the quorum.
Function: revokeSigningRole
Function: setRequiredConfirmations(uint256)
Both approaches prevent the protocol from entering an unrecoverable execution deadlock.
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.