ens-normalize.js
0-dependancy Compact ES6 Ethereum Name Service (ENS) Name Normalizer that works in the browser.
- Follows ENS Name Normalization Standard
- Passes 100% Validation Tests
- Custom
NFCImplementation (or use native)- Passes 100% Unicode
15.0.0Normalization Tests
- Passes 100% Unicode
- Minified File Sizes:
23KB— nativeNFCvia nf-native.js usingString.normalize()32KBDefault — customNFCvia nf.js39KBEverything! — customNFC+ @adraffy/punycode.js + sub-libraries: dns.js, parts.js, utils.js
- Resolver Demo
- List of Supported Emoji
import {ens_normalize} from '@adraffy/ens-normalize';
// npm i @adraffy/ens-normalize
// browser: https://cdn.jsdelivr.net/npm/@adraffy/ens-normalize@latest/dist/index.min.js
// string -> string
// throws on invalid names
// output ready for namehash
let normalized = ens_normalize('RaFFY🚴♂️.eTh');
// "raffy🚴♂.eth"
// note: does not enforce .eth TLD 3-character minimum
Format names with fully-qualified emoji:
// works like ens_normalize
// output ready for display
let pretty = ens_beautify('1⃣2⃣.eth');
// "1️⃣2️⃣.eth"
// note: normalization is unchanged:
// ens_normalize(ens_beautify(x)) == ens_normalize(x)
Normalize name fragments for substring search:
// these fragments fail ens_normalize() due to ens_normalize_post_check() rules
// but will normalize fine as fragments
let frag1 = ens_normalize_fragment('AB--');
let frag2 = ens_normalize_fragment('\u{303}');
// positional logic is delayed until Post-check:
let norm_gTLD = ens_normalize_post_check('eth');
Instead of exposing an IDNA-like API (is_valid(), get_mapped(), etc.), this library exposes a single function which converts names to tokens:
// string -> Token[]
// never throws
let tokens = ens_tokenize('_R💩\u{FE0F}a\u{FE0F}\u{304}\u{AD}./');
// [
// { type: 'isolated', cp: 95 }, // valid w/restrictions
// { // (eg. no combining marks)
// type: 'mapped',
// cp: 82, // input
// cps: [ 114 ] // output
// },
// {
// type: 'emoji',
// input: [ 128169, 65039 ], // input
// emoji: [ 128169, 65039 ], // fully-qualified
// cps: [ 128169 ] // output
// },
// {
// type: 'nfc',
// input: [ 97, 772 ], // input (before nfc, only valid or mapped)
// cps: [ 257 ], // output (after nfc)
// tokens: [ // tokens (before nfc)
// { type: 'valid', cps: [ 97 ] },
// { type: 'ignored', cp: 65039 },
// { type: 'valid', cps: [ 772 ] }
// ]
// },
// { type: 'ignored', cp: 173 },
// { type: 'stop' },
// { type: 'disallowed', cp: 47 }
// ]
Generates an array of supported emoji codepoints:
// () -> number[][]
console.log(ens_emoji());
// [
// [ 2764 ],
// [ 128169, 65039 ],
// [ 128105, 127997, 8205, 9877, 65039 ],
// ...
// ]
Build
git clonethis repo, thennpm install- Follow instructions in /derive/ to generate data files
npm run derive
npm run make— compress data files from/derive/output/- Follow instructions in /validate/ to generate validation tests
npm run validate
npm run test— perform validation testsnpm run build— create/dist/npm run rebuild— run all the commands above

Log in or sign up for Devpost to join the conversation.