ERC-7673 - Distinguishable base256emoji Addresses

Created 2024-04-01
Status Draft
Category ERC
Type Standards Track
Authors

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

Emoji Unicode codepoint Byte Value
๐Ÿš€ U+1F680 0
๐Ÿช U+1FA90 1
โ˜„ U+2604 2
๐Ÿ›ฐ U+1F6F0 3
๐ŸŒŒ U+1F30C 4
๐ŸŒ‘ U+1F311 5
๐ŸŒ’ U+1F312 6
๐ŸŒ“ U+1F313 7
๐ŸŒ” U+1F314 8
๐ŸŒ• U+1F315 9
๐ŸŒ– U+1F316 10
๐ŸŒ— U+1F317 11
๐ŸŒ˜ U+1F318 12
๐ŸŒ U+1F30D 13
๐ŸŒ U+1F30F 14
๐ŸŒŽ U+1F30E 15
๐Ÿ‰ U+1F409 16
โ˜€ U+2600 17
๐Ÿ’ป U+1F4BB 18
๐Ÿ–ฅ U+1F5A5 19
๐Ÿ’พ U+1F4BE 20
๐Ÿ’ฟ U+1F4BF 21
๐Ÿ˜‚ U+1F602 22
โค U+2764 23
๐Ÿ˜ U+1F60D 24
๐Ÿคฃ U+1F923 25
๐Ÿ˜Š U+1F60A 26
๐Ÿ™ U+1F64F 27
๐Ÿ’• U+1F495 28
๐Ÿ˜ญ U+1F62D 29
๐Ÿ˜˜ U+1F618 30
๐Ÿ‘ U+1F44D 31
๐Ÿ˜… U+1F605 32
๐Ÿ‘ U+1F44F 33
๐Ÿ˜ U+1F601 34
๐Ÿ”ฅ U+1F525 35
๐Ÿฅฐ U+1F970 36
๐Ÿ’” U+1F494 37
๐Ÿ’– U+1F496 38
๐Ÿ’™ U+1F499 39
๐Ÿ˜ข U+1F622 40
๐Ÿค” U+1F914 41
๐Ÿ˜† U+1F606 42
๐Ÿ™„ U+1F644 43
๐Ÿ’ช U+1F4AA 44
๐Ÿ˜‰ U+1F609 45
โ˜บ U+263A 46
๐Ÿ‘Œ U+1F44C 47
๐Ÿค— U+1F917 48
๐Ÿ’œ U+1F49C 49
๐Ÿ˜” U+1F614 50
๐Ÿ˜Ž U+1F60E 51
๐Ÿ˜‡ U+1F607 52
๐ŸŒน U+1F339 53
๐Ÿคฆ U+1F926 54
๐ŸŽ‰ U+1F389 55
๐Ÿ’ž U+1F49E 56
โœŒ U+270C 57
โœจ U+2728 58
๐Ÿคท U+1F937 59
๐Ÿ˜ฑ U+1F631 60
๐Ÿ˜Œ U+1F60C 61
๐ŸŒธ U+1F338 62
๐Ÿ™Œ U+1F64C 63
๐Ÿ˜‹ U+1F60B 64
๐Ÿ’— U+1F497 65
๐Ÿ’š U+1F49A 66
๐Ÿ˜ U+1F60F 67
๐Ÿ’› U+1F49B 68
๐Ÿ™‚ U+1F642 69
๐Ÿ’“ U+1F493 70
๐Ÿคฉ U+1F929 71
๐Ÿ˜„ U+1F604 72
๐Ÿ˜€ U+1F600 73
๐Ÿ–ค U+1F5A4 74
๐Ÿ˜ƒ U+1F603 75
๐Ÿ’ฏ U+1F4AF 76
๐Ÿ™ˆ U+1F648 77
๐Ÿ‘‡ U+1F447 78
๐ŸŽถ U+1F3B6 79
๐Ÿ˜’ U+1F612 80
๐Ÿคญ U+1F92D 81
โฃ U+2763 82
๐Ÿ˜œ U+1F61C 83
๐Ÿ’‹ U+1F48B 84
๐Ÿ‘€ U+1F440 85
๐Ÿ˜ช U+1F62A 86
๐Ÿ˜‘ U+1F611 87
๐Ÿ’ฅ U+1F4A5 88
๐Ÿ™‹ U+1F64B 89
๐Ÿ˜ž U+1F61E 90
๐Ÿ˜ฉ U+1F629 91
๐Ÿ˜ก U+1F621 92
๐Ÿคช U+1F92A 93
๐Ÿ‘Š U+1F44A 94
๐Ÿฅณ U+1F973 95
๐Ÿ˜ฅ U+1F625 96
๐Ÿคค U+1F924 97
๐Ÿ‘‰ U+1F449 98
๐Ÿ’ƒ U+1F483 99
๐Ÿ˜ณ U+1F633 100
โœ‹ U+270B 101
๐Ÿ˜š U+1F61A 102
๐Ÿ˜ U+1F61D 103
๐Ÿ˜ด U+1F634 104
๐ŸŒŸ U+1F31F 105
๐Ÿ˜ฌ U+1F62C 106
๐Ÿ™ƒ U+1F643 107
๐Ÿ€ U+1F340 108
๐ŸŒท U+1F337 109
๐Ÿ˜ป U+1F63B 110
๐Ÿ˜“ U+1F613 111
โญ U+2B50 112
โœ… U+2705 113
๐Ÿฅบ U+1F97A 114
๐ŸŒˆ U+1F308 115
๐Ÿ˜ˆ U+1F608 116
๐Ÿค˜ U+1F918 117
๐Ÿ’ฆ U+1F4A6 118
โœ” U+2714 119
๐Ÿ˜ฃ U+1F623 120
๐Ÿƒ U+1F3C3 121
๐Ÿ’ U+1F490 122
โ˜น U+2639 123
๐ŸŽŠ U+1F38A 124
๐Ÿ’˜ U+1F498 125
๐Ÿ˜  U+1F620 126
โ˜ U+261D 127
๐Ÿ˜• U+1F615 128
๐ŸŒบ U+1F33A 129
๐ŸŽ‚ U+1F382 130
๐ŸŒป U+1F33B 131
๐Ÿ˜ U+1F610 132
๐Ÿ–• U+1F595 133
๐Ÿ’ U+1F49D 134
๐Ÿ™Š U+1F64A 135
๐Ÿ˜น U+1F639 136
๐Ÿ—ฃ U+1F5E3 137
๐Ÿ’ซ U+1F4AB 138
๐Ÿ’€ U+1F480 139
๐Ÿ‘‘ U+1F451 140
๐ŸŽต U+1F3B5 141
๐Ÿคž U+1F91E 142
๐Ÿ˜› U+1F61B 143
๐Ÿ”ด U+1F534 144
๐Ÿ˜ค U+1F624 145
๐ŸŒผ U+1F33C 146
๐Ÿ˜ซ U+1F62B 147
โšฝ U+26BD 148
๐Ÿค™ U+1F919 149
โ˜• U+2615 150
๐Ÿ† U+1F3C6 151
๐Ÿคซ U+1F92B 152
๐Ÿ‘ˆ U+1F448 153
๐Ÿ˜ฎ U+1F62E 154
๐Ÿ™† U+1F646 155
๐Ÿป U+1F37B 156
๐Ÿƒ U+1F343 157
๐Ÿถ U+1F436 158
๐Ÿ’ U+1F481 159
๐Ÿ˜ฒ U+1F632 160
๐ŸŒฟ U+1F33F 161
๐Ÿงก U+1F9E1 162
๐ŸŽ U+1F381 163
โšก U+26A1 164
๐ŸŒž U+1F31E 165
๐ŸŽˆ U+1F388 166
โŒ U+274C 167
โœŠ U+270A 168
๐Ÿ‘‹ U+1F44B 169
๐Ÿ˜ฐ U+1F630 170
๐Ÿคจ U+1F928 171
๐Ÿ˜ถ U+1F636 172
๐Ÿค U+1F91D 173
๐Ÿšถ U+1F6B6 174
๐Ÿ’ฐ U+1F4B0 175
๐Ÿ“ U+1F353 176
๐Ÿ’ข U+1F4A2 177
๐ŸคŸ U+1F91F 178
๐Ÿ™ U+1F641 179
๐Ÿšจ U+1F6A8 180
๐Ÿ’จ U+1F4A8 181
๐Ÿคฌ U+1F92C 182
โœˆ U+2708 183
๐ŸŽ€ U+1F380 184
๐Ÿบ U+1F37A 185
๐Ÿค“ U+1F913 186
๐Ÿ˜™ U+1F619 187
๐Ÿ’Ÿ U+1F49F 188
๐ŸŒฑ U+1F331 189
๐Ÿ˜– U+1F616 190
๐Ÿ‘ถ U+1F476 191
๐Ÿฅด U+1F974 192
โ–ถ U+25B6 193
โžก U+27A1 194
โ“ U+2753 195
๐Ÿ’Ž U+1F48E 196
๐Ÿ’ธ U+1F4B8 197
โฌ‡ U+2B07 198
๐Ÿ˜จ U+1F628 199
๐ŸŒš U+1F31A 200
๐Ÿฆ‹ U+1F98B 201
๐Ÿ˜ท U+1F637 202
๐Ÿ•บ U+1F57A 203
โš  U+26A0 204
๐Ÿ™… U+1F645 205
๐Ÿ˜Ÿ U+1F61F 206
๐Ÿ˜ต U+1F635 207
๐Ÿ‘Ž U+1F44E 208
๐Ÿคฒ U+1F932 209
๐Ÿค  U+1F920 210
๐Ÿคง U+1F927 211
๐Ÿ“Œ U+1F4CC 212
๐Ÿ”ต U+1F535 213
๐Ÿ’… U+1F485 214
๐Ÿง U+1F9D0 215
๐Ÿพ U+1F43E 216
๐Ÿ’ U+1F352 217
๐Ÿ˜— U+1F617 218
๐Ÿค‘ U+1F911 219
๐ŸŒŠ U+1F30A 220
๐Ÿคฏ U+1F92F 221
๐Ÿท U+1F437 222
โ˜Ž U+260E 223
๐Ÿ’ง U+1F4A7 224
๐Ÿ˜ฏ U+1F62F 225
๐Ÿ’† U+1F486 226
๐Ÿ‘† U+1F446 227
๐ŸŽค U+1F3A4 228
๐Ÿ™‡ U+1F647 229
๐Ÿ‘ U+1F351 230
โ„ U+2744 231
๐ŸŒด U+1F334 232
๐Ÿ’ฃ U+1F4A3 233
๐Ÿธ U+1F438 234
๐Ÿ’Œ U+1F48C 235
๐Ÿ“ U+1F4CD 236
๐Ÿฅ€ U+1F940 237
๐Ÿคข U+1F922 238
๐Ÿ‘… U+1F445 239
๐Ÿ’ก U+1F4A1 240
๐Ÿ’ฉ U+1F4A9 241
๐Ÿ‘ U+1F450 242
๐Ÿ“ธ U+1F4F8 243
๐Ÿ‘ป U+1F47B 244
๐Ÿค U+1F910 245
๐Ÿคฎ U+1F92E 246
๐ŸŽผ U+1F3BC 247
๐Ÿฅต U+1F975 248
๐Ÿšฉ U+1F6A9 249
๐ŸŽ U+1F34E 250
๐ŸŠ U+1F34A 251
๐Ÿ‘ผ U+1F47C 252
๐Ÿ’ U+1F48D 253
๐Ÿ“ฃ U+1F4E3 254
๐Ÿฅ‚ U+1F942 255

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

base256emoji ERC-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

Copyright and related rights waived via CC0.