Hi all! I’m opening discussion for a new ERC: Permanent Locks for Lockable Tokens, an extension of ERC-6982.
PR: Add ERC: Permanent Locks for Lockable Tokens by ryanio · Pull Request #2084 · ethereum/ERCs · GitHub
Abstract
ERC-6982 lets a contract lock or unlock every token with one DefaultLocked event, with per-token Locked overrides. This extension keeps those events as they are and adds what ERC-6982 leaves open:
- Permanent locks, so marketplaces and wallets can tell a temporary trading pause from a collection that will never be transferable.
- ERC-1155 support, with
tokenIdread as the token type ID. - Mint and burn rules: locking restricts holder transfers only, so minting continues while trading is paused.
interface IERCXXXX /* is IERC165, IERC6982 */ {
event PermanentlyLocked();
error TokenLocked(uint256 tokenId);
function permanentlyLocked() external view returns (bool);
}
A trading pause during a mint is DefaultLocked(true) at deployment and DefaultLocked(false) when trading opens, which is plain ERC-6982. A soulbound collection emits DefaultLocked(true) and PermanentlyLocked() once at deployment, and the lock can never be lifted after that.
Why
Creators regularly turn off secondary transfers for a while: during a public mint, before a reveal, during a migration. Other collections are non-transferable for good, such as credentials and badges. Marketplaces need to stop offering trades in both cases, but should treat them differently: keep orders for when a pause lifts, and label a permanent lock as non-transferable.
ERC-6982 can’t express permanence, requires ERC-721, and doesn’t say whether minting continues while locked. ERC-5192 covers permanent locks, but needs one event per token.
Looking for feedback on
- Permanence uses a separate event because ERC-6982 is Final. The lock has to be in place before it’s marked permanent, so a consumer that only knows ERC-6982 still sees every token as locked.
- Permanence is contract-wide only. The motivating cases lock whole collections, and ERC-5192 already covers single soulbound tokens, so the interface stays at one event, one view, and one error.
- Permanence is one way. Once marked, the contract can never emit an unlock for the default or for any token.
- Strict reverts apply only to permanent locks. Temporary locks keep ERC-6982’s flexibility, where a protector wallet can still move a locked token.
- There’s no range event. The default status covers whole collections and
Lockedcovers single tokens. - There’s no expected end time field. Pauses often end early or late, and a stale end time would lead consumers to show orders that revert.
The draft’s reference implementation is an OpenZeppelin 5.x ERC-721 that locks at deployment and lets the owner unlock, lock again, or make the lock permanent.
If this would help your marketplace, wallet, or contract, a +1 here or on the PR helps get it merged as a Draft.