Skip to content

Commit

Permalink
ENSIP-18: Profile Text Records (#154)
Browse files Browse the repository at this point in the history
  • Loading branch information
TateB committed Mar 28, 2024
1 parent f7797f5 commit 485566a
Show file tree
Hide file tree
Showing 3 changed files with 185 additions and 0 deletions.
4 changes: 4 additions & 0 deletions app/local/config/navigation/protocol.ts
Expand Up @@ -680,6 +680,10 @@ export const navigation: SectionData[] = [
title: '16 - Offchain Metadata',
href: '/ensip/16',
},
{
title: '18 - Profile Text Records',
href: '/ensip/18',
},
],
},
],
Expand Down
180 changes: 180 additions & 0 deletions docs/ensip/18.mdx
@@ -0,0 +1,180 @@
{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */}
export const meta = {
description: 'A standard for profile information as text records in ENS',
contributors: [
'TateB',
'adraffy',
'galligan',
],
ensip: {
status: 'draft',
created: '2023-08-02',
}
};

# ENSIP-18: Profile Text Records

### Abstract

This ENSIP which extends [ENSIP-5: Text Records](ensip-5-text-records.md) defines a set of text records that should be used for profile information, along with the format that each should have.

### Motivation

ENS names have become increasingly popular to use as an identifying profile across the Ethereum ecosystem. Although many apps have started integrating ENS "profiles", the only defined global text record keys are in ENSIP-5. These global keys were defined based on the usecase of ENS names at the time, and were not created with profiles in mind.

This specification extends the existing set of global keys, as well as creating a new subset within global keys called "profile keys".

### Specification

The Profile Keys are a subset of Global Keys, the newly defined global keys are specified in the "Global Keys" section.

#### `alias`

**Description:** A display alias

**Format:** Any text

**Example:** `ENS`

**Design Considerations:** This should be displayed near the ENS name, but should not be displayed as a replacement for it and should be below it in the visual hierarchy. You can also choose not to show the alias at all.

#### `theme`

**Description:** A user customised theme to use

**Format:** An array of comma separated hex colours.
Order should be as follows: `<background>,<text>,<accent>,<accentText>,<border>`.
Colours can be full or half length hex codes (e.g. `FFFFFF`, or `FFF`). A colour scheme can be incomplete but still valid by skipping a value similar to CSV (e.g. `000000,,F6F6F6,FFFFFF,FFF700`)

**Example:** `3889FF,000,F6F6F6,FFFFFF,FFF700`

**Design Considerations:** These colours can be used wherever a profile context is used (e.g. more than just the name), but separate colour schemes should never be used together on the same page. The scheme can also be extended to site-wide themability based on the primary name of the connected wallet. Selected accent and text colours should maintain a 4.5:1 contrast ratio against the selected background colour. Contrast ratio should be validated on record submission, as well as retrieval. If on retrieval colours do not meet the required contrast ratio, they should not be used. If the context requires that colours from a specific theme be used (e.g. an app theme), you can use the closest match to a colour in the theme.

**Other Notes:** If allowing a user to select a theme that is specific to one vendor (e.g. `com.example`), you should use a vendor specific version of this record e.g. `com.example.theme`

#### `avatar`

**Description:** An avatar image

**Format:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md)

**Example:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md)

**Design Considerations:** This should be displayed next to the ENS name wherever possible. The image should be displayed with an aspect ratio of 1:1. If the source doesn't match the target ratio, the image should be cropped from the centre to fill the ratio. The image should not have any visible blank space.

#### `header`

**Description:** A header image

**Format:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md)

**Example:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md)

**Design Considerations:** This should be displayed above all other profile content, or not at all. The image should be displayed with an aspect ratio of between 3:1 and 6:1. If the source doesn't match the target ratio, the image should be cropped from the centre to fill the ratio. The image should not have any visible blank space.

#### `email`

**Description:** An email that can be used as contact

**Format:** Standard email address

**Example:** `test@example.com`

**Design Considerations:** None.

#### `description`

**Description:** A biography

**Format:** Any string not exceeding 160 characters in length.

**Example:** `Human readable names for Ethereum.`

**Design Considerations:** None.

#### `location`

**Description:** A location

**Format:** Any location, if location is layered should use `, ` for separation (e.g. `Melbourne, Australia`)

**Example:** `Melbourne, Australia`

**Design Considerations:** This value should not be assumed to be real coordinates or properly formatted place, as it may be a non-existent location

#### `url`

**Description:** A website URL

**Format:** Any valid HTTP or HTTPS link.

**Example:** `https://ens.domains`

**Design Considerations:** This link should be clickable, and wherever possible shown at the bottom of the profile.

#### `timezone`

**Description:** A timezone

**Format:** Any timezone name from the [tz database](https://www.iana.org/time-zones). Follows `<area>/<location>[/<quantifier>]`

**Example:** `Australia/Melbourne`

**Design Considerations:** None.

#### `language`

**Description:** A language

**Format:** A two letter language code from [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes).

**Example:** `en`

**Design Considerations:** None.

### `primary-contact`

**Description:** The record key for a primary contact

**Format:** `email`, or any existing profile service key

**Example:** `com.github`

**Design Considerations:** When resolving `primary-contact` for a profile, the value should resolve to the service (which could be logo or name) and the corresponding value. Direct links to the service should be supported on a best-effort basis (e.g. `com.github` => `https://github.com/`)

#### Global Keys

Profile Keys are a subset of Global Keys, therefore these global keys extend the existing global keys defined in ENSIP-5.

- `alias`
- `theme`
- `header`
- `timezone`
- `language`
- `primary-contact`

#### Profile Service Keys

A profile service key is a profile key derived from the root of the service's domain. E.g. `com.github`, `org.telegram`, etc.

When creating a profile service key record, the value should be **void of optional service-specific formatting** such as prefixes like `/u/` or `@`.

In the case that the value is always displayed in a certain format, the formatting may be kept. However, any parsing or processing done on said value should attempt to be compatible with values that do not have the formatting applied.

#### Image files

When **setting** an image for an avatar or header, it is **strongly recommended** to limit the file size to an absolute maximum of 10MB. The image being set should be validated against this limit, whether it is a URL, or an NFT. Ideally, if creating an image to be set on behalf of the user, the file size should be limited to 2MB. Additionally, maintainers of image endpoints should support dimensions of images to be limited via query string `?width={width}&height={height}` wherever possible.

When **retrieving** an image for an avatar or header, images should attempt to be loaded if 10MB or less in file size. Loading images above 10MB is not required, but ideally loading should still be attempted. If retrieving an image via URL, a query string can be optionally appended to the URL to limit the dimensions via `?width={width}&height={height}`. However, the query string may have no effect.

### Backwards Compatibility

The `alias` key replaces the pre-existing `name` key. When displaying an alias, you should consider also resolving the `name` key and displaying it, if `alias` is not available.

### Security Considerations

None.

### Copyright

Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
1 change: 1 addition & 0 deletions docs/ensip/index.mdx
Expand Up @@ -34,6 +34,7 @@ Improvement Proposals have included anything from new contract features, to text
| [14 - On-chain Source Parameter](/ensip/14) | ✍️ Draft |
| [15 - Normalization Standard](/ensip/15) | ✍️ Draft |
| [16 - Offchain Metadata](/ensip/16) | ✍️ Draft |
| [18 - Profile Text Records](/ensip/18) | ✍️ Draft |

{/* ## Propose an ENSIP
Expand Down

0 comments on commit 485566a

Please sign in to comment.