ERC-7673

Distinguishable base256emoji Addresses

Depict Account Addresses As A String of Emoji

StatusReview

TypeStandards Track

CategoryERC

Created2024-04-01

AuthorsWilliam Morriss (@wjmelements)

Last synced5/19/2026, 1:24:16 AM

Branchmaster

Upstreamethereum/ERCs/ERCS/erc-7673.md

Abstract

Introduce base256emoji for use as the primary input and display for account addresses in all user interfaces.

Motivation

Human users often fail to distinguish between long strings of hexadecimal characters, especially when they match at the beginning and at the end. This makes hexadecimal strings a poor format for human-readable account addresses. The problem is being exploited by several spoofing strategies that mine similar addresses and spoof ERC-20 Transfer events with the goal of tricking the end user into copying the wrong recipient address. These address spoofing attacks have mislead tens of thousands of ether, and countless other tokens. Spoofers flooding the network with fake Transfer events waste network resources and complicate blockchain accounting. Improving the distinguishability of addresses will reduce the incentives for this behavior.

Specification

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119 and RFC 8174.

User interfaces:

  • SHALL depict account addresses as a base256emoji string instead of hexadecimal.
  • SHALL accept base256emoji strings as input for user-supplied account address parameters.
  • SHOULD recognize and interpret strings of exactly 20 consecutive emoji as addresses when all of them are valid base256emoji.

base256emoji encoding table

EmojiUnicode codepointByte Value
🚀U+1F6800
🪐U+1FA901
U+26042
🛰U+1F6F03
🌌U+1F30C4
🌑U+1F3115
🌒U+1F3126
🌓U+1F3137
🌔U+1F3148
🌕U+1F3159
🌖U+1F31610
🌗U+1F31711
🌘U+1F31812
🌍U+1F30D13
🌏U+1F30F14
🌎U+1F30E15
🐉U+1F40916
U+260017
💻U+1F4BB18
🖥U+1F5A519
💾U+1F4BE20
💿U+1F4BF21
😂U+1F60222
U+276423
😍U+1F60D24
🤣U+1F92325
😊U+1F60A26
🙏U+1F64F27
💕U+1F49528
😭U+1F62D29
😘U+1F61830
👍U+1F44D31
😅U+1F60532
👏U+1F44F33
😁U+1F60134
🔥U+1F52535
🥰U+1F97036
💔U+1F49437
💖U+1F49638
💙U+1F49939
😢U+1F62240
🤔U+1F91441
😆U+1F60642
🙄U+1F64443
💪U+1F4AA44
😉U+1F60945
U+263A46
👌U+1F44C47
🤗U+1F91748
💜U+1F49C49
😔U+1F61450
😎U+1F60E51
😇U+1F60752
🌹U+1F33953
🤦U+1F92654
🎉U+1F38955
💞U+1F49E56
U+270C57
U+272858
🤷U+1F93759
😱U+1F63160
😌U+1F60C61
🌸U+1F33862
🙌U+1F64C63
😋U+1F60B64
💗U+1F49765
💚U+1F49A66
😏U+1F60F67
💛U+1F49B68
🙂U+1F64269
💓U+1F49370
🤩U+1F92971
😄U+1F60472
😀U+1F60073
🖤U+1F5A474
😃U+1F60375
💯U+1F4AF76
🙈U+1F64877
👇U+1F44778
🎶U+1F3B679
😒U+1F61280
🤭U+1F92D81
U+276382
😜U+1F61C83
💋U+1F48B84
👀U+1F44085
😪U+1F62A86
😑U+1F61187
💥U+1F4A588
🙋U+1F64B89
😞U+1F61E90
😩U+1F62991
😡U+1F62192
🤪U+1F92A93
👊U+1F44A94
🥳U+1F97395
😥U+1F62596
🤤U+1F92497
👉U+1F44998
💃U+1F48399
😳U+1F633100
U+270B101
😚U+1F61A102
😝U+1F61D103
😴U+1F634104
🌟U+1F31F105
😬U+1F62C106
🙃U+1F643107
🍀U+1F340108
🌷U+1F337109
😻U+1F63B110
😓U+1F613111
U+2B50112
U+2705113
🥺U+1F97A114
🌈U+1F308115
😈U+1F608116
🤘U+1F918117
💦U+1F4A6118
U+2714119
😣U+1F623120
🏃U+1F3C3121
💐U+1F490122
U+2639123
🎊U+1F38A124
💘U+1F498125
😠U+1F620126
U+261D127
😕U+1F615128
🌺U+1F33A129
🎂U+1F382130
🌻U+1F33B131
😐U+1F610132
🖕U+1F595133
💝U+1F49D134
🙊U+1F64A135
😹U+1F639136
🗣U+1F5E3137
💫U+1F4AB138
💀U+1F480139
👑U+1F451140
🎵U+1F3B5141
🤞U+1F91E142
😛U+1F61B143
🔴U+1F534144
😤U+1F624145
🌼U+1F33C146
😫U+1F62B147
U+26BD148
🤙U+1F919149
U+2615150
🏆U+1F3C6151
🤫U+1F92B152
👈U+1F448153
😮U+1F62E154
🙆U+1F646155
🍻U+1F37B156
🍃U+1F343157
🐶U+1F436158
💁U+1F481159
😲U+1F632160
🌿U+1F33F161
🧡U+1F9E1162
🎁U+1F381163
U+26A1164
🌞U+1F31E165
🎈U+1F388166
U+274C167
U+270A168
👋U+1F44B169
😰U+1F630170
🤨U+1F928171
😶U+1F636172
🤝U+1F91D173
🚶U+1F6B6174
💰U+1F4B0175
🍓U+1F353176
💢U+1F4A2177
🤟U+1F91F178
🙁U+1F641179
🚨U+1F6A8180
💨U+1F4A8181
🤬U+1F92C182
U+2708183
🎀U+1F380184
🍺U+1F37A185
🤓U+1F913186
😙U+1F619187
💟U+1F49F188
🌱U+1F331189
😖U+1F616190
👶U+1F476191
🥴U+1F974192
U+25B6193
U+27A1194
U+2753195
💎U+1F48E196
💸U+1F4B8197
U+2B07198
😨U+1F628199
🌚U+1F31A200
🦋U+1F98B201
😷U+1F637202
🕺U+1F57A203
U+26A0204
🙅U+1F645205
😟U+1F61F206
😵U+1F635207
👎U+1F44E208
🤲U+1F932209
🤠U+1F920210
🤧U+1F927211
📌U+1F4CC212
🔵U+1F535213
💅U+1F485214
🧐U+1F9D0215
🐾U+1F43E216
🍒U+1F352217
😗U+1F617218
🤑U+1F911219
🌊U+1F30A220
🤯U+1F92F221
🐷U+1F437222
U+260E223
💧U+1F4A7224
😯U+1F62F225
💆U+1F486226
👆U+1F446227
🎤U+1F3A4228
🙇U+1F647229
🍑U+1F351230
U+2744231
🌴U+1F334232
💣U+1F4A3233
🐸U+1F438234
💌U+1F48C235
📍U+1F4CD236
🥀U+1F940237
🤢U+1F922238
👅U+1F445239
💡U+1F4A1240
💩U+1F4A9241
👐U+1F450242
📸U+1F4F8243
👻U+1F47B244
🤐U+1F910245
🤮U+1F92E246
🎼U+1F3BC247
🥵U+1F975248
🚩U+1F6A9249
🍎U+1F34E250
🍊U+1F34A251
👼U+1F47C252
💍U+1F48D253
📣U+1F4E3254
🥂U+1F942255

Rationale

Previous attempts to reduce spoofing and other copy errors such as ERC-55 have not reduced the number of characters in an address. Any base-256 standard would achieve this goal but emoji were chosen to maximize human-distinguishability. Multiple base-256 emoji encodings have been proposed. The base256emoji encoding was chosen due to its acceptance into the multibase repository.

This standard does not also recommend base256emoji for use in depicting other bytestrings such as transaction hashes and calldata. Transaction hashes are not yet being spoofed. Calldata is best decoded via the appropriate ABI. By only using base256emoji for addresses, addresses can be easily noticed among other information.

Backwards Compatibility

Using the encoding table, the base256emoji encoding can be transcoded into hexadecimal and vice-versa.

Test Cases

base256emojiERC-55
🚀🚀🚀🚀🚀🚀😀💓🥴💣👻🙌🙈🤢😥☹🌏💩🍎💕0x0000000000004946c0e9F43F4Dee607b0eF1fA1c
🚀🚀🚀🚀🚀🚀💸🎊💡🌿🚩🔥📌🙂💙❄🛰💩🤝⭐0x000000000000c57CF0A1f923d44527e703F1ad70
☀☀☀☀☀❤🌊🌖❌💀✔🌎🎈❌💞🛰💗😅❓☄0x111111111117dC0aa78b770fA6A738034120C302
👍🤫😋✊🤪😞🤐👶😭❤👉🚩💔🌱🤝🌊💚🪐🚩😐0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
😆🌎✅✨👋😜💛☺😶👋🐸🤩🌔🙌✋🤤⭐🍑☹⚡0x2a0f713aA953442EacA9EA47083f656170e67BA4
🔥🤬🌔😝😞🙄👌💢🗣🌍✨😙🐾😡😑🤘💸😂😤🔵0x23B608675a2B2fB1890d3ABBd85c5775c51691d5
🗣😅😞✨🤷😆🌟🐷🌷👶☝🪐🥀🖥🤟🐉💀💪😏❄0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7
🥴😆😰✌🤟🔥📣🎵🌖🌏😡🎶💙🐸🍒🌔😱🤘🍀➡0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
▶🌻😥👏💘😛💐💨❄💸😂😪😝🤤🐸💻😟☝🍃🥺0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72

Reference Implementation

to_emoji = [
    '🚀', '🪐', '☄', '🛰', '🌌', '🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘', '🌍', '🌏', '🌎',
    '🐉', '☀', '💻', '🖥', '💾', '💿', '😂', '❤', '😍', '🤣', '😊', '🙏', '💕', '😭', '😘', '👍',
    '😅', '👏', '😁', '🔥', '🥰', '💔', '💖', '💙', '😢', '🤔', '😆', '🙄', '💪', '😉', '☺', '👌',
    '🤗', '💜', '😔', '😎', '😇', '🌹', '🤦', '🎉', '💞', '✌', '✨', '🤷', '😱', '😌', '🌸', '🙌',
    '😋', '💗', '💚', '😏', '💛', '🙂', '💓', '🤩', '😄', '😀', '🖤', '😃', '💯', '🙈', '👇', '🎶',
    '😒', '🤭', '❣', '😜', '💋', '👀', '😪', '😑', '💥', '🙋', '😞', '😩', '😡', '🤪', '👊', '🥳',
    '😥', '🤤', '👉', '💃', '😳', '✋', '😚', '😝', '😴', '🌟', '😬', '🙃', '🍀', '🌷', '😻', '😓',
    '⭐', '✅', '🥺', '🌈', '😈', '🤘', '💦', '✔', '😣', '🏃', '💐', '☹', '🎊', '💘', '😠', '☝',
    '😕', '🌺', '🎂', '🌻', '😐', '🖕', '💝', '🙊', '😹', '🗣', '💫', '💀', '👑', '🎵', '🤞', '😛',
    '🔴', '😤', '🌼', '😫', '⚽', '🤙', '☕', '🏆', '🤫', '👈', '😮', '🙆', '🍻', '🍃', '🐶', '💁',
    '😲', '🌿', '🧡', '🎁', '⚡', '🌞', '🎈', '❌', '✊', '👋', '😰', '🤨', '😶', '🤝', '🚶', '💰',
    '🍓', '💢', '🤟', '🙁', '🚨', '💨', '🤬', '✈', '🎀', '🍺', '🤓', '😙', '💟', '🌱', '😖', '👶',
    '🥴', '▶', '➡', '❓', '💎', '💸', '⬇', '😨', '🌚', '🦋', '😷', '🕺', '⚠', '🙅', '😟', '😵',
    '👎', '🤲', '🤠', '🤧', '📌', '🔵', '💅', '🧐', '🐾', '🍒', '😗', '🤑', '🌊', '🤯', '🐷', '☎',
    '💧', '😯', '💆', '👆', '🎤', '🙇', '🍑', '❄', '🌴', '💣', '🐸', '💌', '📍', '🥀', '🤢', '👅',
    '💡', '💩', '👐', '📸', '👻', '🤐', '🤮', '🎼', '🥵', '🚩', '🍎', '🍊', '👼', '💍', '📣', '🥂'
]
from_emoji = {emoji: "{0:02x}".format(i) for i, emoji in enumerate(to_emoji)}

def encode_address(hexadecimal_address):
    if len(hexadecimal_address) != 42 or not hexadecimal_address.startswith('0x'):
        return None
    return ''.join([to_emoji[int(hexadecimal_address[i:i+2], 16)] for i in range(2, 42, 2)])


def decode_address(emoji_address):
    # In python, these unicode characters all have a len() of 1
    if len(emoji_address) != 20:
        return None
    try:
        return '0x' + ''.join(from_emoji[emoji] for emoji in emoji_address)
    except IndexError:
        return None

Security Considerations

With the base256emoji encoding, addresses use half as many characters. The characters used are more distinguishable. This squares the difficulty of generating similar addresses, making address spoofing impractical.

Copyright and related rights waived via CC0.

Requires

Documents resolved from the normalized requires field.

Nothing here yet

No required documents from the emitted subset were resolved for this spec.

Required by

Documents in the emitted subset that declare this spec as a dependency.

Nothing here yet

No emitted documents currently depend on this spec.

Related documents

Simple metadata-based neighbors using family, type, category, and status overlap.