Admin pause or freeze powers
Can any privileged role stop, freeze, or block payments through the settlement contracts, and how is that role constrained? C1
The contracts have no explicit pause, freeze or blacklist. A timelocked role can still stop settlement: it can swap the helper that computes every proof's public inputs, swap or remove verifiers, and edit the relayer allowlist. HinkalTimelockController holds that power on Ethereum, with a 6-hour delay. Its proposer, executor, canceller and admin is a 2-of-3 Safe with no modules or guard. We found no disclosure of the signers, and no document sets the delay against a user exit. The factory 0x0c61…923c also still holds DEFAULT_ADMIN_ROLE, but its bytecode has no call path to Hinkal's admin functions. That contract is unverified, so we judge this from its function selectors only. Scored 1: a multisig behind a timelock, but the signers are undisclosed.
Evidence (5)5 verified
- Verified
HINKAL_HELPER_MANAGER can replace hinkalHelper at any time (setHinkalHelper, L46-L50). transact() calls hinkalHelper.performHinkalChecks and uses its return value as the proof's public inputs (Hinkal.sol L38-L56), so the helper can block every transaction.
Hinkal-Protocol/Hinkal-Contracts-Circuits · contracts/HinkalBase.sol
- Verified
The owner can register or remove any verifier (registerVerifiers, removeVerifier). The helper's owner manages the relayer allowlist (RelayStore.sol L30-L57). The contracts contain no pause, freeze or address blacklist.
Hinkal-Protocol/Hinkal-Contracts-Circuits · contracts/VerifierFacade.sol
- Verified
owner() of Hinkal is HinkalTimelockController 0xF043…b7D0 at block 26153565. The timelock also holds HINKAL_HELPER_MANAGER and DEFAULT_ADMIN_ROLE, and owns the helper 0x5f91…7C1b (helper owner() read at the same block).
- Verified
HinkalTimelockController getMinDelay() returns 21600 s (6 h), raised from 180 s in a MinDelayChange event. PROPOSER, EXECUTOR, CANCELLER and TIMELOCK_ADMIN are all held by Safe 0x4d28…D7fB.
- Verified
Safe 1.4.1, getThreshold() 2 of 3 owners (0xBdc7…1942, 0x6c7F…6Fd7, 0xe799…66B6). getModulesPaginated(0x1,10) returns no modules, and the guard slot is zero.