In the contract ABI the gatekeeper is the
guard address, set with setGuard().Responsibilities
- Monitor
DepositPendingevents. - Screen depositors with chain-analysis tools.
- Approve with
approveDeposit(), binding a trace key into the note. - Reject with
rejectDeposit(), refunding the depositor. - Pull ERC-20 deposits with
pullDeposit()against a signedPullIntent.
Gatekeeper address
The gatekeeper is a single privileged address in pool storage. Only it can approve, reject or pull. The admin can replace it withsetGuard(). The gatekeeper key is treated as a hot key: it cannot change fees, roles, verifiers or the whitelist.
Approve
keccak256(recipient, token, amount, depositor, gasEscrow) and compares it with the stored pending hash. The gatekeeper cannot approve modified parameters (InvalidDepositData). On approval the pool:
- charges the deposit fee in force at that moment
- inserts a note for
amount − feeto the recipient’s inbox key - emits
NoteAdded,DepositStatusChanged(APPROVED),Deposit - settles the gas escrow
Reject
checkCost, checkFee[token] and 1% of the deposit. No protocol fee is charged.
Permit deposits
For ERC-20s, a depositor can sign an EIP-712PullIntent and approve the pool. The gatekeeper checks the address first and pulls only clean funds, so nothing is ever pending.
- Each
requestIdcan be used once (PullRequestUsed). - Expired intents are refused (
PullIntentExpired). - ECDSA is tried first, then ERC-1271, so EIP-7702 accounts and smart wallets both work.
- The note always goes to the depositor’s own inbox key. There is no recipient parameter.
- The gas withheld is capped at
maxPullGasFee[token]and at 5% of what arrived.
Gas escrow settlement
The gatekeeper’s gas is reimbursed from the deposit’s escrow:overheadissettleGasOverhead, or 45,000 gas while that is 0. On Robinhood Chain it is raised to cover the L1 data fee.- When one transaction settles several deposits, every settlement after the first gets 25,000 gas less, so batching can’t turn escrow into profit.
- The depositor’s share is sent with a 30,000-gas stipend. A wallet that refuses it forfeits it to the gatekeeper, so it can never block its own credit.
GasEscrowSettled(index, toGuard, toDepositor).