feat(ensapi): domain profile parsing in Omnigraph#2240
Conversation
…9 coin address parsers to Domain.profile
🦋 Changeset detectedLatest commit: a07ef62 The changes in this PR will be included in the next version bump. This PR includes changesets to release 24 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughThis PR implements ChangesProfile resolution implementation
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
Greptile SummaryThis PR wires up the previously stubbed-out
Confidence Score: 5/5Safe to merge — the profile field is fully wired with good test coverage across unit, integration, and edge-case scenarios; the model refactor is applied consistently across all access sites. The core data flow (selection building → merged forward resolution → interpreter-per-field) is correct and well-tested. The ResolvedRecordsModel refactor touching records.ts, domain.ts, and primary-name-record.ts is applied uniformly with no missed access sites. Social and address interpreters handle the full range of input shapes and include comprehensive test coverage. The only findings are two style-level redundancies. No files require special attention; profile.ts has a minor website double-interpretation inconsistency noted in the review. Important Files Changed
Sequence DiagramsequenceDiagram
participant Client
participant DomainResolve as Domain.resolve resolver
participant SelBuilder as buildRecordsSelection<br/>+ buildProfileSelection
participant Merge as mergeRecordsSelections
participant ENS as resolveForward (ENS protocol)
participant Profile as DomainProfile resolvers
participant Records as ResolvedRecords resolvers
Client->>DomainResolve: "{ resolve { records { texts(...) } profile { description avatar { httpUrl } socials { github { handle } } } } }"
DomainResolve->>SelBuilder: buildRecordsSelectionFromResolveContainerInfo(info)
SelBuilder-->>DomainResolve: "{ texts: [...requested keys] }"
DomainResolve->>SelBuilder: buildProfileSelectionFromResolveContainerInfo(info)
SelBuilder-->>DomainResolve: "{ texts: [description,avatar,com.github,vnd.github] }"
DomainResolve->>Merge: mergeRecordsSelections(recordsSel, profileSel)
Merge-->>DomainResolve: merged selection (deduped)
DomainResolve->>ENS: resolveForward(name, mergedSelection)
ENS-->>DomainResolve: ResolverRecordsResponseBase
DomainResolve-->>DomainResolve: toResolvedRecordsModel(name, response) → ResolvedRecordsModel
DomainResolve->>Records: parent.result (ResolvedRecordsModel)
Records-->>Client: texts, addresses, etc.
DomainResolve->>Profile: parent.result (ResolvedRecordsModel)
Profile->>Profile: ProfileDescriptionInterpreter.interpret(model)
Profile->>Profile: ProfileAvatarInterpreter.interpret(model)
Profile->>Profile: SocialGithubInterpreter.interpret(model)
Profile-->>Client: description, avatar.httpUrl, socials.github.handle
Reviews (7): Last reviewed commit: "Merge branch 'main' into ll/domain-profi..." | Re-trigger Greptile |
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@apps/ensapi/src/omnigraph-api/lib/resolution/profile/build-profile-selection.test.ts`:
- Around line 119-148: The current test named "builds selection from inline
fragments within profile selection" actually uses a named fragment spread
(...ProfileFields) and doesn't cover the InlineFragment branch in
buildProfileSelectionFromResolveContainerInfo; add a new test case that
constructs a GraphQL operation with an actual inline fragment (e.g. `{ resolve {
profile { ... on DomainProfile { description avatar { httpUrl } } } } }`), build
the same GraphQLResolveInfo (fieldNodes = [resolveField], fragments = {},
returnType = DomainResolveType, variableValues = {}), and assert the expected
selection (texts: ["description","avatar"]) to exercise the InlineFragment
handling in buildProfileSelectionFromResolveContainerInfo; optionally rename the
existing test to mention "named fragment spread" if you prefer clarity.
In `@apps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/images.ts`:
- Around line 29-35: The parser currently treats whitespace-only image records
as populated; change the parse function in images.ts so the fetched value is
trimmed before any checks: compute a trimmedRaw from
records.texts?.[record]?.trim() (or trim immediately when assigning raw), use
trimmedRaw for the empty-string/null guard, and pass trimmedRaw into
parseDirectImageHttpUrl and interpretProfileImageHttpUrl so whitespace-only
values are treated as empty and do not produce a metadata-service URL.
In `@apps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/social.ts`:
- Around line 53-63: The parser currently accepts any matching hostname and
extracts a handle without validating that the incoming URL's pathname is inside
the configured base path; update the logic in the Social... parser (where
variables toParse, url, hostnames, baseUrl, pathOffset, handle, httpUrl are
used) to first parse baseUrl (baseUrlParsed) and ensure url.pathname begins with
baseUrlParsed.pathname (compare segments or prefix, normalizing leading/trailing
slashes) before slicing segments and assigning handle; also ensure query and
fragment are removed (ignore url.search and url.hash) when producing httpUrl and
when computing the handle so only the validated base path + handle segments are
accepted.
In `@apps/ensapi/src/omnigraph-api/lib/resolution/profile/README.md`:
- Line 7: The README's fenced code block containing the directory-tree entry
"profile/" is missing a language tag (markdownlint MD040); update that fenced
block by adding a language identifier such as "text" (i.e., change the opening
fence from ``` to ```text) so the linter is satisfied while preserving the block
content.
In `@apps/ensapi/src/omnigraph-api/schema/domain.ts`:
- Around line 207-213: The ternary guarding mergedSelection is redundant because
the earlier early-return ensures name is truthy and normalized; replace the
conditional expression with a direct assignment to mergedSelection by calling
mergeRecordsSelections(buildRecordsSelectionFromResolveContainerInfo(info),
buildProfileSelectionFromResolveContainerInfo(info)) and remove the `name &&
isNormalizedName(name) ? ... : null` check so mergedSelection is always the
merged result in this code path.
In `@apps/ensapi/src/omnigraph-api/schema/primary-name-record.ts`:
- Around line 69-79: The ternary guarding mergedSelection with "name &&
isNormalizedName(name)" is redundant because earlier logic already guarantees
name is truthy and normalized; replace the conditional with a direct assignment:
call mergeRecordsSelections(buildRecordsSelectionFromResolveContainerInfo(info),
buildProfileSelectionFromResolveContainerInfo(info)) and remove the null branch
and subsequent if (!mergedSelection) early return that treats records as null;
ensure mergedSelection is used as before and delete the dead code paths
referencing the null case.
In `@packages/ensnode-sdk/src/shared/zod-schemas.ts`:
- Around line 154-167: The JSDoc for parsing an EVM address was accidentally
left above makeEmailSchema, so move the misplaced comment block that starts
"Parses a serialized representation of an EVM address into a {`@link`
NormalizedAddress}." so it immediately precedes makeNormalizedAddressSchema;
ensure the Email comment ("Parses a string into a validated {`@link` Email}
(trimmed).") stays above makeEmailSchema and that both functions
(makeEmailSchema and makeNormalizedAddressSchema) have their correct JSDoc
directly above them.
In `@packages/enssdk/src/lib/ens-metadata-service.ts`:
- Around line 32-41: The getEnsMetadataServiceImageUrl function currently calls
new URL(name, base) which allows an absolute or protocol-relative name to
override metadata. Add a defensive check at the start of
getEnsMetadataServiceImageUrl to reject names that begin with '//' or match a
URI scheme pattern like /^[a-zA-Z][a-zA-Z0-9+.-]*:/ (for example return null)
before calling namespaceIdToMetadataNetwork and new URL(...), so only
relative/name-only inputs produce URLs; reference getEnsMetadataServiceImageUrl,
namespaceIdToMetadataNetwork, and EnsMetadataImageRecord to locate the code to
change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 9d9d3e7c-9db0-472b-8726-b6da7fc5b906
⛔ Files ignored due to path filters (3)
packages/enssdk/src/omnigraph/generated/introspection.tsis excluded by!**/generated/**packages/enssdk/src/omnigraph/generated/schema.graphqlis excluded by!**/generated/**pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (42)
.changeset/domain-profile-omnigraph.mdapps/ensapi/src/handlers/api/resolution/resolve-records.integration.test.tsapps/ensapi/src/omnigraph-api/builder.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/README.mdapps/ensapi/src/omnigraph-api/lib/resolution/profile/build-profile-selection.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/build-profile-selection.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/addresses.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/addresses.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/images.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/images.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/index.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/social.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/social.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/test-helpers.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/texts.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/texts.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/types.tsapps/ensapi/src/omnigraph-api/lib/resolution/records-selection.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/records-selection.tsapps/ensapi/src/omnigraph-api/schema/account.integration.test.tsapps/ensapi/src/omnigraph-api/schema/domain.integration.test.tsapps/ensapi/src/omnigraph-api/schema/domain.tsapps/ensapi/src/omnigraph-api/schema/forward-resolve.tsapps/ensapi/src/omnigraph-api/schema/primary-name-record.tsapps/ensapi/src/omnigraph-api/schema/profile.tsapps/ensapi/src/omnigraph-api/schema/scalars.tspackages/datasources/package.jsonpackages/datasources/src/devnet/constants.tspackages/enskit/src/react/omnigraph/_lib/cache-exchange.tspackages/ensnode-sdk/src/omnigraph-api/example-queries.tspackages/ensnode-sdk/src/shared/zod-schemas.tspackages/enssdk/src/lib/ens-metadata-service.test.tspackages/enssdk/src/lib/ens-metadata-service.tspackages/enssdk/src/lib/index.tspackages/enssdk/src/lib/types/addresses.tspackages/enssdk/src/lib/types/email.tspackages/enssdk/src/lib/types/index.tspackages/enssdk/src/omnigraph/graphql.tspackages/integration-test-env/src/seed/resolver-records.tspackages/namehash-ui/src/components/identity/EnsAvatar.tsxpackages/namehash-ui/src/index.tspackages/namehash-ui/src/utils/ensMetadata.ts
💤 Files with no reviewable changes (1)
- packages/namehash-ui/src/utils/ensMetadata.ts
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/enssdk/src/lib/ens-metadata-service.ts (1)
39-44:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winReject root-relative names (
namestarting with/) before building the metadata URL.
name.startsWith("//")andURI_SCHEME_PATTERNblock protocol-relative URLs and custom schemes, butnew URL("/foo", base)still drops thehttps://metadata.ens.domains/${network}/${record}/prefix and builds a different metadata path. Guard leading/(and extend the malicious-input test set to include"/foo").🛠 Proposed fix
- if (name.startsWith("//") || URI_SCHEME_PATTERN.test(name)) return null; + if (name.startsWith("/") || URI_SCHEME_PATTERN.test(name)) return null;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/enssdk/src/lib/ens-metadata-service.ts` around lines 39 - 44, The function that builds ENS metadata URLs currently only rejects protocol-relative URLs via name.startsWith("//") but still allows root-relative names like "/foo" which cause new URL(name, base) to ignore the base; change the guard to reject any name that starts with "/" (e.g., use name.startsWith("/") instead of name.startsWith("//")) alongside the existing URI_SCHEME_PATTERN check, so the block becomes: reject leading-slash inputs and scheme-matching inputs before calling namespaceIdToMetadataNetwork and new URL(...); also update the malicious-input test set to include "/foo" to cover this case.apps/ensapi/src/omnigraph-api/schema/domain.integration.test.ts (1)
700-729: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winKeep
DomainProfileResultaligned with the expanded query.
DomainProfileResultstill only typesavatar,addresses.ethereum, andsocials.github, but the query/assertion now depend onheader,website,bitcoin,litecoin,solana,telegramtoo. That weakens the compile-time contract for this test and makes future schema drift in those new fields easier to miss.♻️ Suggested shape update
type DomainProfileResult = { domain: { resolve: { profile: { description: string | null; avatar: { httpUrl: UrlString | null } | null; - addresses: { ethereum: NormalizedAddress | null } | null; - socials: { github: { handle: string; httpUrl: UrlString } | null } | null; + header: { httpUrl: UrlString | null } | null; + website: { httpUrl: UrlString | null } | null; + email: string | null; + addresses: { + ethereum: NormalizedAddress | null; + bitcoin: string | null; + litecoin: string | null; + solana: string | null; + } | null; + socials: { + github: { handle: string; httpUrl: UrlString } | null; + twitter: { handle: string; httpUrl: UrlString } | null; + telegram: { handle: string; httpUrl: UrlString } | null; + } | null; } | null; }; }; };🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/ensapi/src/omnigraph-api/schema/domain.integration.test.ts` around lines 700 - 729, The DomainProfileResult TypeScript type is out of sync with the expanded GraphQL query DomainProfile; update the DomainProfileResult type (the domain.resolve.profile shape) to include header and website as { httpUrl: UrlString | null }, email as string | null, addresses to include bitcoin, litecoin, solana (each NormalizedAddress | null), and socials to include twitter and telegram with the same { httpUrl: UrlString; handle: string } | null shape as github so the test's compile-time contract matches the query.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@apps/ensapi/src/omnigraph-api/schema/domain.integration.test.ts`:
- Around line 700-729: The DomainProfileResult TypeScript type is out of sync
with the expanded GraphQL query DomainProfile; update the DomainProfileResult
type (the domain.resolve.profile shape) to include header and website as {
httpUrl: UrlString | null }, email as string | null, addresses to include
bitcoin, litecoin, solana (each NormalizedAddress | null), and socials to
include twitter and telegram with the same { httpUrl: UrlString; handle: string
} | null shape as github so the test's compile-time contract matches the query.
In `@packages/enssdk/src/lib/ens-metadata-service.ts`:
- Around line 39-44: The function that builds ENS metadata URLs currently only
rejects protocol-relative URLs via name.startsWith("//") but still allows
root-relative names like "/foo" which cause new URL(name, base) to ignore the
base; change the guard to reject any name that starts with "/" (e.g., use
name.startsWith("/") instead of name.startsWith("//")) alongside the existing
URI_SCHEME_PATTERN check, so the block becomes: reject leading-slash inputs and
scheme-matching inputs before calling namespaceIdToMetadataNetwork and new
URL(...); also update the malicious-input test set to include "/foo" to cover
this case.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: d8bdb6bc-f163-4550-9fd7-3f5a58f183b3
📒 Files selected for processing (24)
.changeset/domain-profile-omnigraph.mdapps/ensapi/src/omnigraph-api/lib/resolution/profile/README.mdapps/ensapi/src/omnigraph-api/lib/resolution/profile/build-profile-selection.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/addresses.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/addresses.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/images.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/social.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/test-helpers.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/texts.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/parsers/types.tsapps/ensapi/src/omnigraph-api/lib/resolution/records-profile-model.tsapps/ensapi/src/omnigraph-api/lib/resolution/records-selection.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/records-selection.tsapps/ensapi/src/omnigraph-api/schema/account.integration.test.tsapps/ensapi/src/omnigraph-api/schema/domain.integration.test.tsapps/ensapi/src/omnigraph-api/schema/domain.tsapps/ensapi/src/omnigraph-api/schema/forward-resolve.tsapps/ensapi/src/omnigraph-api/schema/primary-name-record.tsapps/ensapi/src/omnigraph-api/schema/records.tsapps/ensapi/src/omnigraph-api/schema/scalars.tspackages/ensnode-sdk/src/shared/zod-schemas.tspackages/enssdk/src/lib/ens-metadata-service.test.tspackages/enssdk/src/lib/ens-metadata-service.tspackages/enssdk/src/lib/types/email.ts
lightwalker-eth
left a comment
There was a problem hiding this comment.
@sevenzing Looks amazing! 🚀 🚀 Great work! Shared a few suggestions. Please take the lead to merge when ready 👍
There was a problem hiding this comment.
♻️ Duplicate comments (1)
apps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/social.ts (1)
52-65:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy liftBase path validation is still missing.
The parser accepts any URL with a matching hostname, even when the pathname is outside the configured base path. For example,
SocialLinkedInParser(baseUrlhttps://www.linkedin.com/in) would accepthttps://linkedin.com/company/namehashand incorrectly extract handlenamehashbecause only the hostname is validated.🛡️ Suggested fix to validate base path
try { const url = new URL(toParse); if (hostnames.includes(url.hostname)) { + const baseUrlParsed = new URL(baseUrl); + const baseSegments = baseUrlParsed.pathname.split("/").filter((s) => s.length > 0); const segments = url.pathname.split("/").filter((s) => s.length > 0); + const matchesBasePath = baseSegments.every( + (segment, index) => segments[index] === segment, + ); + if (!matchesBasePath) return null; + - handle = segments.slice(pathOffset).join("/"); - handle = handle === "" ? null : handle; + handle = segments.slice(pathOffset).join("/") || null; if (handle) { - const baseUrlParsed = new URL(baseUrl); url.host = baseUrlParsed.host; url.protocol = baseUrlParsed.protocol; url.pathname = url.pathname.endsWith("/") ? url.pathname.slice(0, -1) : url.pathname; httpUrl = url.toString(); } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/social.ts` around lines 52 - 65, The parser currently only checks hostname and then slices pathname using pathOffset, which lets URLs outside the configured base path (baseUrl) pass; update the block inside the hostnames check to parse baseUrl into baseUrlParsed and validate that url.pathname starts with baseUrlParsed.pathname (normalize trailing slashes) or that the pathname segments before pathOffset match the base path segments before extracting handle; only proceed to set handle, url.host/protocol/pathname and httpUrl when the base path matches. Use the existing variables baseUrl, baseUrlParsed, pathOffset, url.pathname, handle and httpUrl to implement this validation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Duplicate comments:
In `@apps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/social.ts`:
- Around line 52-65: The parser currently only checks hostname and then slices
pathname using pathOffset, which lets URLs outside the configured base path
(baseUrl) pass; update the block inside the hostnames check to parse baseUrl
into baseUrlParsed and validate that url.pathname starts with
baseUrlParsed.pathname (normalize trailing slashes) or that the pathname
segments before pathOffset match the base path segments before extracting
handle; only proceed to set handle, url.host/protocol/pathname and httpUrl when
the base path matches. Use the existing variables baseUrl, baseUrlParsed,
pathOffset, url.pathname, handle and httpUrl to implement this validation.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 402837a4-1c63-4876-95fd-a567477f0f81
⛔ Files ignored due to path filters (2)
packages/enssdk/src/omnigraph/generated/schema.graphqlis excluded by!**/generated/**pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (35)
apps/ensapi/package.jsonapps/ensapi/src/handlers/api/resolution/resolve-primary-name.integration.test.tsapps/ensapi/src/handlers/api/resolution/resolve-primary-names.integration.test.tsapps/ensapi/src/handlers/api/resolution/resolve-records.integration.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/README.mdapps/ensapi/src/omnigraph-api/lib/resolution/profile/build-profile-selection.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/addresses.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/addresses.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/images.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/images.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/index.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/social.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/social.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/test-helpers.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/texts.test.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/texts.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/types.tsapps/ensapi/src/omnigraph-api/lib/resolution/profile/profile-descriptions.tsapps/ensapi/src/omnigraph-api/schema/account.integration.test.tsapps/ensapi/src/omnigraph-api/schema/domain.integration.test.tsapps/ensapi/src/omnigraph-api/schema/forward-resolve.tsapps/ensapi/src/omnigraph-api/schema/profile.tsapps/ensapi/src/omnigraph-api/schema/resolution.integration.test.tspackages/datasources/src/devnet/constants.tspackages/ensnode-sdk/package.jsonpackages/ensnode-sdk/src/omnigraph-api/example-queries.tspackages/enssdk/src/lib/ens-metadata-service.test.tspackages/enssdk/src/lib/ens-metadata-service.tspackages/integration-test-env/package.jsonpackages/integration-test-env/src/devnet/fixtures.tspackages/integration-test-env/src/devnet/index.tspackages/integration-test-env/src/seed/index.tspackages/integration-test-env/src/seed/resolver-records.tspackages/namehash-ui/src/components/identity/EnsAvatar.tsxpackages/namehash-ui/src/index.ts
💤 Files with no reviewable changes (2)
- apps/ensapi/src/omnigraph-api/lib/resolution/profile/interpreters/test-helpers.ts
- packages/namehash-ui/src/index.ts
|
@greptile review |
lightwalker-eth
left a comment
There was a problem hiding this comment.
@sevenzing This is amazing 🚀 🚀 ! Big milestone for us! Great job!
Sharing a few very small nits that will be nice to optimize in a small new PR before we release this. Cheers!
| email: Email | ||
|
|
||
| """ | ||
| Interpreted header metadata. Returns null when the raw header record is unset or empty. |
There was a problem hiding this comment.
| Interpreted header metadata. Returns null when the raw header record is unset or empty. | |
| The interpreted header image on the profile of the ENS name. Returns null when the raw header record is unset or empty. |
| addresses: ProfileAddresses | ||
|
|
||
| """ | ||
| Interpreted avatar metadata. Returns null when the raw avatar record is unset or empty. |
There was a problem hiding this comment.
| Interpreted avatar metadata. Returns null when the raw avatar record is unset or empty. | |
| The interpreted avatar image on the profile of the ENS name. Returns null when the raw avatar record is unset or empty. |
| """An interpreted profile for a name.""" | ||
| """The interpreted profile of an ENS name.""" | ||
| type DomainProfile { | ||
| """The interpreted addresses on the profile of an ENS name.""" |
There was a problem hiding this comment.
| """The interpreted addresses on the profile of an ENS name.""" | |
| """The interpreted addresses on the profile of the ENS name.""" |
|
|
||
| """The profile description, or null when unset.""" | ||
| """ | ||
| The interpreted description on the profile of an ENS name, or null when unset. |
There was a problem hiding this comment.
| The interpreted description on the profile of an ENS name, or null when unset. | |
| The interpreted description on the profile of the ENS name, or null when unset. |
|
|
||
| """The contact email address, or null when unset or invalid.""" | ||
| """ | ||
| The interpreted email address on the profile of an ENS name, or null when unset or invalid. |
There was a problem hiding this comment.
| The interpreted email address on the profile of an ENS name, or null when unset or invalid. | |
| The interpreted email address on the profile of the ENS name, or null when unset or invalid. |
| """ | ||
| header: ProfileHeader | ||
|
|
||
| """The interpreted social accounts on the profile of an ENS name.""" |
There was a problem hiding this comment.
| """The interpreted social accounts on the profile of an ENS name.""" | |
| """The interpreted social accounts on the profile of the ENS name.""" |
| """The interpreted social accounts on the profile of an ENS name.""" | ||
| socials: ProfileSocials | ||
|
|
||
| """The interpreted website on the profile of an ENS name.""" |
There was a problem hiding this comment.
| """The interpreted website on the profile of an ENS name.""" | |
| """The interpreted website on the profile of the ENS name.""" |
Lite PR
Tip: Review docs on the ENSNode PR process
Summary
Why
Testing
Notes for Reviewer (Optional)
Pre-Review Checklist (Blocking)