Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/assets/simplexBadge.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// SimpleX NFT badge — the two-tone "X" on navy, matching the dApp's
// public/simplex-nft-badge.jpg used by NFTTemplate on the registration
// "congratulations" screen. Inlined as a base64 data URI (not read from
// disk) so the renderer works on filesystem-less hosts (Cloudflare Workers).
export const SIMPLEX_BADGE_DATA_URI =
'data:image/jpeg;base64,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';
27 changes: 24 additions & 3 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
const path = require('path');
const { getAddress } = require('ethers');
require('dotenv').config();

// Normalise addresses to EIP-55 checksum form. checkContract() compares the
// route's contract address (run through ethers.getAddress) against these with
// `===`, so a lowercase override from the env would silently fail to match.
const checksum = (addr: string) => getAddress(addr);

const PORT = process.env.PORT || 8080;
const HOST = process.env.HOST || 'localhost';
const ENV = process.env.ENV || 'local'; // local/prod
Expand All @@ -11,6 +17,18 @@ const CANVAS_FONT_PATH = path.join(FONT_FOLDER, 'Satoshi-Bold.ttf');
const CANVAS_EMOJI_FONT_PATH = path.join(FONT_FOLDER, 'NotoColorEmoji.ttf');
const INAMEWRAPPER = process.env.INAMEWRAPPER || '0xd82c42d8';

// --- SNRC customisations ---
// The deployment indexes our own ENS-shaped contracts on mainnet (the .testing
// / .simplex TLDs), served by the self-hosted Graph Node from
// simplex-namespace-contract/scripts/subgraph — not the public ENS subgraph.
// When set, SUBGRAPH_URL overrides the per-network table in service/network.ts.
const SUBGRAPH_URL = process.env.SUBGRAPH_URL || '';
// TLD used for display fallbacks (hashed / ellipsised names). Normalised names
// already carry their TLD via the subgraph `name` field.
const SIMPLEX_TLD = process.env.SIMPLEX_TLD || 'testing';
// dApp base URL used for the OpenSea `url` field (link back to the name page).
const DAPP_BASE_URL = process.env.DAPP_BASE_URL || 'https://testing-names.simplex.chat';

const IPFS_GATEWAY = process.env.IPFS_GATEWAY || 'https://ipfs.io';
const INFURA_API_KEY = process.env.INFURA_API_KEY || '';
const OPENSEA_API_KEY = process.env.OPENSEA_API_KEY || '';
Expand All @@ -23,9 +41,9 @@ const NODE_PROVIDER_URL_CF = process.env.NODE_PROVIDER_URL_CF || '';
const NODE_PROVIDER_URL_GOERLI = process.env.NODE_PROVIDER_URL_GOERLI || '';
const NODE_PROVIDER_URL_SEPOLIA = process.env.NODE_PROVIDER_URL_SEPOLIA || '';

const ADDRESS_ETH_REGISTRAR = process.env.ADDRESS_ETH_REGISTRAR || '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85';
const ADDRESS_ETH_REGISTRY = process.env.ADDRESS_ETH_REGISTRY || '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e'
const ADDRESS_NAME_WRAPPER = process.env.ADDRESS_NAME_WRAPPER || '0x114D4603199df73e7D157787f8778E21fCd13066';
const ADDRESS_ETH_REGISTRAR = checksum(process.env.ADDRESS_ETH_REGISTRAR || '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85');
const ADDRESS_ETH_REGISTRY = checksum(process.env.ADDRESS_ETH_REGISTRY || '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e');
const ADDRESS_NAME_WRAPPER = checksum(process.env.ADDRESS_NAME_WRAPPER || '0x114D4603199df73e7D157787f8778E21fCd13066');

const SERVER_URL =
ENV === 'local' ? `http://localhost:${PORT}` : `https://${HOST}`;
Expand All @@ -48,6 +66,9 @@ export {
ADDRESS_ETH_REGISTRAR,
ADDRESS_ETH_REGISTRY,
ADDRESS_NAME_WRAPPER,
DAPP_BASE_URL,
SIMPLEX_TLD,
SUBGRAPH_URL,
CANVAS_FONT_PATH,
CANVAS_EMOJI_FONT_PATH,
ETH_REGISTRY_ABI,
Expand Down
7 changes: 1 addition & 6 deletions src/endpoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ import { Express } from 'express';
import { ensMetadata } from './controller/ensMetadata';
import { ensImage } from './controller/ensImage';
import { ensRasterize } from './controller/ensRasterize';
import { avatarMetadata } from './controller/avatarMetadata';
import { avatarImage } from './controller/avatarImage';
// SNRC: avatars are out of scope (issue #3); the /avatar routes are not registered.
import { headerMetadata } from './controller/headerMetadata';
import { headerImage } from './controller/headerImage';
import { queryNFTep } from './controller/queryNFT';
Expand All @@ -31,10 +30,6 @@ export default function (app: Express) {
ensRasterize
);

app.get('/:networkName/avatar/:name/meta', avatarMetadata);

app.get('/:networkName/avatar/:name', avatarImage);

app.get('/:networkName/header/:name/meta', headerMetadata);

app.get('/:networkName/header/:name', headerImage);
Expand Down
13 changes: 7 additions & 6 deletions src/service/domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@ import {
decodeFuses,
getWrapperState
} from '../utils/fuse';
import { namehash } from '@ensdomains/ensjs/utils';
import { createBatchQuery } from '../utils/batchQuery';
import { getNamehash } from '../utils/namehash';
import { bigIntToUint8Array } from '../utils/bigIntToUint8Array';
import { SERVER_URL, SIMPLEX_TLD } from '../config';

const eth =
'0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae';
// SNRC: TLD parent node (upstream hardcoded namehash('eth')).
const eth = namehash(SIMPLEX_TLD);
const GRACE_PERIOD_MS = 7776000000; // 90 days as milliseconds

export async function getDomain(
Expand Down Expand Up @@ -105,11 +107,10 @@ export async function getDomain(
}
metadata.generateImage();
} else {
metadata.setBackground(
`https://metadata.ens.domains/${networkName}/avatar/${name}`
);
// SNRC: avatars unsupported (issue #3); no avatar background. Image points
// at this service's own /image route (SERVER_URL), not metadata.ens.domains.
metadata.setImage(
`https://metadata.ens.domains/${networkName}/${contractAddress}/${hexId}/image`
`${SERVER_URL}/${networkName}/${contractAddress}/${hexId}/image`
);
}
}
Expand Down
12 changes: 6 additions & 6 deletions src/service/metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
registerFont
} from 'canvas';
import { Version } from '../base';
import { CANVAS_FONT_PATH, CANVAS_EMOJI_FONT_PATH } from '../config';
import { CANVAS_FONT_PATH, CANVAS_EMOJI_FONT_PATH, SIMPLEX_TLD, DAPP_BASE_URL } from '../config';
import createSVGfromTemplate from '../svg-template';
import base64EncodeUnicode from '../utils/base64encode';
import { isASCII, findCharacterSet } from '../utils/characterSet';
Expand Down Expand Up @@ -64,7 +64,7 @@ export class Metadata {
this.description = this.formatDescription(name, description);
this.attributes = this.initializeAttributes(created_date, label);
this.url = this.is_normalized
? `https://app.ens.domains/name/${name}`
? `${DAPP_BASE_URL}/${name}`
: null;
this.last_request_date = last_request_date;
this.version = version;
Expand All @@ -79,12 +79,12 @@ export class Metadata {
? ens_beautify(name)
: tokenId.replace(
new RegExp('^(.{0,6}).*(.{4})$', 'im'),
'[$1...$2].eth'
`[$1...$2].${SIMPLEX_TLD}`
);
}

formatDescription(name: string, description?: string) {
const baseDescription = description || `${this.name}, an ENS name.`;
const baseDescription = description || `${this.name}, a SimpleX name.`;
const normalizedNote = !this.is_normalized
? ` (${name} is not in normalized form)`
: '';
Expand Down Expand Up @@ -114,7 +114,7 @@ export class Metadata {
if (
version == Version.v2 &&
wrapperState === WrapperState.WRAPPED &&
(label.split('.').length > 1 || !label.endsWith('.eth'))
(label.split('.').length > 1 || !label.endsWith('.' + SIMPLEX_TLD))
) {
return ' [ ⚠️ ATTENTION: THE NFT FOR THIS NAME CAN BE REVOKED AT ANY TIME WHILE IT IS IN THE WRAPPED STATE ]';
}
Expand Down Expand Up @@ -261,7 +261,7 @@ export class Metadata {
name.substring(0, Metadata.MAX_CHAR - 7) +
'...' +
name.substring(_nameLength - 7, _nameLength - 4) +
'.eth'
'.' + SIMPLEX_TLD
);
}

Expand Down
8 changes: 8 additions & 0 deletions src/service/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
NODE_PROVIDER_URL_CF,
NODE_PROVIDER_URL_GOERLI,
NODE_PROVIDER_URL_SEPOLIA,
SUBGRAPH_URL as SUBGRAPH_URL_OVERRIDE,
THE_GRAPH_API_KEY,
} from '../config';

Expand Down Expand Up @@ -59,6 +60,13 @@ export default function getNetwork(network: NetworkName): {
// currently subgraphs used under this function are outdated,
// we will have namewrapper support and more attributes when latest subgraph goes to production
let SUBGRAPH_URL: string;
// SNRC: a self-hosted Graph Node (indexing our mainnet .testing/.simplex
// contracts) overrides the public per-network table when configured.
if (SUBGRAPH_URL_OVERRIDE) {
const WEB3_URL = getWeb3URL(NODE_PROVIDER, NODE_PROVIDER_URL, network);
const provider = new JsonRpcProvider(WEB3_URL, network, { staticNetwork: true });
return { WEB3_URL, SUBGRAPH_URL: SUBGRAPH_URL_OVERRIDE, provider };
}
switch (network) {
case NETWORK.LOCAL:
SUBGRAPH_URL = 'http://127.0.0.1:8000/subgraphs/name/graphprotocol/ens';
Expand Down
7 changes: 5 additions & 2 deletions src/service/subgraph.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { gql } from 'graphql-request';
import { namehash } from '@ensdomains/ensjs/utils';
import { SIMPLEX_TLD } from '../config';

const ETH_NAMEHASH =
'0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae';
// SNRC: the 2LD lookup filters on the parent TLD node. Upstream hardcoded
// namehash('eth'); we derive it from the configured TLD (.testing / .simplex).
const ETH_NAMEHASH = namehash(SIMPLEX_TLD);

export const GET_DOMAINS = gql`
query getDomains($tokenId: String) {
Expand Down
Loading