{"id":"ERC-6381","name":"Public NFT Emote Repository","status":"Final","chain":"both","category":{"id":"social","name":"Social & Messaging","description":"Communication and reactions"},"journeyStages":[{"id":"specialized","name":"Specialized Interactions","description":"Physical items, AI, social, gaming"}],"uxImpact":"ERC-6381 is an official Final public NFT emote repository standard superseded for new integrations by ERC-7409, recording reversible wallet reactions. ERC-7409 provides string-based emoji encoding; existing ERC-6381 deployments may remain usable, while new integrations should prefer ERC-7409.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-6381","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","supersededBy":"ERC-7409","historical":true,"kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-6381","summary":"ERC-6381 is an official Final public NFT emote repository standard superseded for new integrations by ERC-7409, recording reversible wallet reactions. ERC-7409 provides string-based emoji encoding; existing ERC-6381 deployments may remain usable, while new integrations should prefer ERC-7409.","applicability":{"whenToUse":["An NFT product needs public on-chain reaction events and current active counts.","The UI can call emoteCountOf/hasEmoterUsedEmote and explain state=true versus state=false.","The product labels wallet activity separately from event history and unique-human sentiment."],"whenToAvoid":["The repository or target collection does not support the emote interface.","The product needs irreversible reactions or unique-human sentiment metrics.","The app cannot index events and show current counts separately from history."]},"designerTakeaways":["Show active reaction counts separately from historical Emoted events.","Explain that a wallet reaction can be revoked and that counts can decrease.","Use emoteCountOf and hasEmoterUsedEmote for current state when supported.","Describe counts as wallet activity, not proof of unique-human sentiment.","Prefer ERC-7409 for new integrations and label ERC-6381 as the legacy encoding."],"problemsSolved":[{"problem":"NFT reactions need a shared on-chain event shape","oldWay":"Each marketplace stores likes in a private database","newWay":"emote and Emoted provide a common collection/token/emoji/state model","impact":"high"},{"problem":"Users need current reaction counts","oldWay":"A UI shows stale or platform-specific totals","newWay":"emoteCountOf reads the current active count for an emoji","impact":"high"},{"problem":"Users need to undo a reaction","oldWay":"A mistaken reaction remains active forever","newWay":"state=false revokes the reaction and emits the state change","impact":"medium"},{"problem":"Indexers need reaction history","oldWay":"Current counts cannot show when or who reacted","newWay":"Emoted events provide an indexable change history","impact":"medium"}],"uxPatterns":[{"name":"NFT Reaction Bar","description":"Show active counts and the user's current reaction state; history is a separate view.","userFlow":["User views NFT","App reads emoteCountOf for selected emojis","User chooses an emoji","App shows gas and current state","User signs emote with state=true or false","Count and active state update; event history remains available"]},{"name":"Reaction Picker","description":"Choose which emote to send","userFlow":["User opens Add Reaction","Picker shows supported emoji values","App queries current count and hasEmoterUsedEmote","User confirms on/off state","Receipt updates active count"]},{"name":"Collection Engagement Dashboard","description":"Report active wallet reactions and event history as separate metrics.","userFlow":["Collection owner views dashboard","See total reactions across collection","Breakdown by emoji type","See most popular NFTs","Track engagement over time","Label metrics as active wallet activity and show event history separately"]},{"name":"My Reactions Feed","description":"Track your reactions across NFTs","userFlow":["User views profile","App lists current reactions and revocations from events","Each item shows active or revoked state","User can submit state=false to undo an active reaction"]}],"uiComponents":[{"name":"ReactionBar","description":"Displays reactions with counts","states":["loading","loaded","updating"],"props":["reactions","onReact","userReactions"]},{"name":"EmojiPicker","description":"Select emoji to react with","states":["closed","open","selecting","sending"],"props":["allowedEmojis","onSelect","disabled"]},{"name":"ReactionCounter","description":"Single emoji with count","states":["inactive","active","user-reacted"],"props":["emoji","count","onClick","highlighted"]},{"name":"CollectionEngagement","description":"Dashboard for collection reaction stats","states":["loading","loaded","empty"],"props":["collection","reactions","timeRange"]}],"antiPatterns":[{"pattern":"Not showing that reactions cost gas","why":"Users surprised by transaction popup for \"free\" action","instead":"Show gas and whether the action turns a reaction on or off before signing.","severity":"high"},{"pattern":"Hiding reaction counts on listings","why":"Engagement signals hidden from buyers","instead":"Show current active count with a timestamp and a separate history view.","severity":"medium"},{"pattern":"Too many emoji options overwhelming users","why":"Analysis paralysis, users don't react","instead":"Show top 8-12 popular emojis, expandable for more","severity":"medium"},{"pattern":"No way to remove reactions","why":"Mistaken reactions stuck forever","instead":"Allow state=false unreacting and show the resulting transaction/history state.","severity":"low"},{"pattern":"Calling wallet counts authentic community sentiment","why":"The standard records wallet activity and does not establish unique humans or resist Sybil behavior.","instead":"Label counts as active wallet reactions and disclose the limits of the metric.","severity":"high"}],"keyTakeaways":["ERC-6381 records reversible on-chain reactions for NFTs.","Active counts and historical events are different views.","Counts represent wallet activity and do not establish unique-human sentiment.","ERC-7409 supersedes ERC-6381 for new integrations with string emoji encoding."],"technicalNotes":"ERC-6381 defines emote(collection, tokenId, emoji, state) and bulk/presigned variants, emits Emoted when state changes, and exposes emoteCountOf(collection, tokenId, emoji), bulkEmoteCountOf, hasEmoterUsedEmote, and related presign helpers. state=true activates a reaction and state=false revokes it; history is indexable from events while current counts are reversible. ERC-7409 supersedes ERC-6381 with string-based emoji encoding; preserve the distinction when displaying legacy collections.","lastUpdated":"2026-09-18","specConstraints":[{"id":"emote-deadline","constraint":"A signed emote request must be rejected after its deadline.","appliesTo":"application","normativity":"normative","specQuote":"* @dev MUST revert if the `deadline` has passed.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-6381#specification","designImplication":"Show the signature deadline and give users a clear expired-request state instead of retrying a stale message silently."},{"id":"emote-domain-replay","constraint":"The signed emote is domain-separated by repository and chain so a signature cannot be replayed on another chain.","appliesTo":"application","normativity":"security-considerations","specQuote":"The `DOMAIN_SEPARATOR` used in the message to be signed is unique to the repository smart contract of the chain it is deployed on.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-6381#security-considerations","designImplication":"Show the repository and network in signed-action review. Never treat a valid signature as portable across chains."},{"id":"emote-presigned-reuse","constraint":"Presigned emote messages can be reused until their deadline, so short deadlines are advised when a service needs revocation.","appliesTo":"application","normativity":"security-considerations","specQuote":"We suggest that the services using the repository in cnjunction with presigned messages use deadlines that invalidate presigned messages after a reasonalby short period of time.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-6381#security-considerations","designImplication":"Use short-lived signed actions when the product needs a reaction to stop being replayable after a state change."},{"id":"emote-replay-rejection","constraint":"Emote repositories SHOULD reject an operation when a replay attack is attempted.","appliesTo":"application","normativity":"security-considerations","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-6381#security-considerations","designImplication":"Show replay rejection as a distinct signature failure and never present an emote as accepted until the repository confirms it.","specQuote":"The ability to use ECDSA signatures to emote on someone else's behalf introduces the risk of a replay attack, which the format of the message to be signed guards against. The `DOMAIN_SEPARATOR` used in the message to be signed is unique to the repository smart contract of the chain it is deployed on. This means that the signature is invalid on any other chain and the Emote repositories deployed on them should revert the operation if a replay attack is attempted."}],"sources":[{"label":"ERC-6381 official specification","url":"https://ercs.ethereum.org/ERCS/erc-6381","type":"official-spec"}],"lastReviewed":"2026-09-18","relatedStandards":[{"id":"ERC-7409","relationship":"Successor with string-based emoji encoding; prefer for new integrations while legacy deployments remain separately labeled."}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-6381","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-6381","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-6381","markdown":"https://www.eipsfordesigners.com/standards/ERC-6381/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-6381/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-6381","official":"https://ercs.ethereum.org/ERCS/erc-6381","discussion":"https://ethereum-magicians.org/search?q=ERC-6381"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}