First of all, great job on the proposal, it adds great value to make it token-agnostic.
I think it’s difficult to select which permissioning features to include and which to intentionally exclude from the standard.
If we’re aiming for a truly minimal implementation, one could argue that some parts can be omitted, as it could be reduced to a transfer-check standard. Similar to ERC-902 and ERC-1462.
- Exclude
recall, and achieve the functionality throughmintandburn. Specificity and simplicity are lost. - Exclude
isUserAllowed; the same functionality is achieved withisTransferAllowed. Error-handling specificity is lost.
I then believe there are two possible paths for this standard:
- Universal token transfer check, non-opinionated on the admin or functionality standpoint. Additional ERCs can be built on top to standardize whitelisting, pausing/unpausing, access-control, or other compliance mechanisms.
- Universal RWA token, with core token functionality embedded:
forceTransfer/recall,freezeTokens,frozenBalance. Compliance functionality should be built on top, similarly to the previous option.
I believe a security/RWA/permissioned token standard should be opinionated on the core token functionality.
I propose the following changes:
- Add
mintandburnmethods to the interface. Specify thatisUserAllowed(to)must be run onmint, and thatisUserAllowed(from)must not be run onburn—T-REX-like. - Specify that
isUserAllowed(to)must be run onrecalland thatisUserAllowed(from)must not be run onrecall. - Add
freezeTokens,unfreezeTokens, andfrozenBalancemethods, plusTokensFrozenandTokensUnfrozenevents. In my experience, token freezing is always required by regulators. It can be implemented as a separate module, but if we assumeisUserAllowedprovides the necessary specificity, token freezing should be required too.burnandrecallshould unfreeze tokens as needed. - Prepend errors with an ERCX prefix, similar to ERC-6093.
- Rename
recalltoforceTransfer, andRecalledtoForcedTransfer.Recalledhas a meaning of returning or withdrawing; I would stick to the core action and call it a forced transfer, regardless of the underlying reason it’s used. This is obviously a nit.