feat: add ApprovalRevocationEnforcer#177
Open
jeffsmale90 wants to merge 6 commits intomainfrom
Open
Conversation
AllowanceRevocationEnforcerApprovalRevocationEnforcer
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 84896cd. Configure here.
jeffsmale90
commented
Apr 28, 2026
Contributor
Author
jeffsmale90
left a comment
There was a problem hiding this comment.
Looks good to me!
Minor comment regarding using the term permission to refer to the allowed revocation mechanism.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What?
This enforcer grants the authority to revoke allowances granted by either:
approve(spender,amount)approve(to,tokenId)setApprovalForAll(operator,approved)This covers approvals set for ERC20, ERC721 and ERC1155 tokens.
Why?
The enforcer now verifies that the target implements the expected token standard, by first invoking the standard-specific function to check the allowance being revoked.
Advanced Permissions currently has an
erc20-token-revocationpermission that grants the authority to revoke only ERC20 approvals. NFT approvals are also required.By combining these revocations into a single enforcer, we get a number of benefits:
How?
The enforcer accepts terms of exactly 1 byte, interpreted as a bitmask of the following values:
0x01) - ERC-20 approve(spender, 0) (spender non-zero, amount zero)0x02) - ERC-721 per-token approve(address(0), tokenId)0x04) - ERC-721 / ERC-1155 setApprovalForAll(operator, false)Indicating which revocation primitives the delegation authorizes. Terms must be non-zero, and the reserved upper bits must not be set.
The
beforeHookonly runs in single call type and default execution mode. It first performs general verification - no native value is sent (no additional value limiting caveat is required), and execution calldata is the expected length - then dispatches by selector.setApprovalForAllandapproveare distinguished by selector. The twoapprovesignatures share a selector and are distinguished by the spender / to (first) parameter — if it is the zero address, the call is treated as the ERC-721 approve(to, tokenId) form; otherwise it is treated as the ERC-20 approve(spender, amount) form. Any other selector is rejected.Each branch then performs a check against the delegator's current approval state on the target, ensuring the revocation is to an existing approval - ensuring that the contract implementation is a valid target for the invocation.
Note
Medium Risk
Introduces a new enforcer that gates execution based on calldata parsing and external token-interface calls; while it only enables approval reductions, incorrect routing/standard assumptions could cause unexpected reverts or missed revocations across tokens and redelegation chains.
Overview
Adds
ApprovalRevocationEnforcer, a newCaveatEnforcerthat allows delegates to only clear existing token approvals (ERC-20approve(spender,0), ERC-721approve(address(0),tokenId), and ERC-721/1155setApprovalForAll(operator,false)) gated by a 1-byte terms bitmask, restricted to single-call + default execution mode, zero native value, and fixed calldata length, with pre-checks against current on-chain approval state.Updates docs (
CaveatEnforcers.md) with usage/terms and redelegation semantics caveats, wires the enforcer into the deploy script and verification list, and adds a comprehensive test suite covering term validation, selector/flag routing, failure modes on non-token targets, integration revocation flows, and redelegation edge cases.Reviewed by Cursor Bugbot for commit 3f7906f. Bugbot is set up for automated code reviews on this repo. Configure here.