skills/resolving-domains/SKILL.md
ENS and Web3 identity resolution for XMTP agents. Use when resolving domain names, extracting mentions, or fetching Farcaster profiles. Triggers on ENS resolution, Farcaster lookup, or mention extraction.
npx skillsauth add xmtplabs/xmtp-agent-examples resolving-domainsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Resolve Web3 identities including ENS, Farcaster, Basenames, and Lens Protocol.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
|----------|----------|--------|--------|
| 1 | Resolve | HIGH | resolve- |
| 2 | Extract | HIGH | extract- |
| 3 | Profiles | MEDIUM | profiles- |
resolve-address - Resolve domain names to addressesresolve-mentions - Resolve all mentions in a messageextract-mentions - Extract @mentions from textprofiles-farcaster - Fetch Farcaster profile datavitalik.ethdwr.eth, username.farcaster.ethtony.base.ethstani.lensimport { createNameResolver } from "@xmtp/agent-sdk";
// Resolve a single name using the SDK resolver
const resolver = createNameResolver(process.env.WEB3_BIO_API_KEY || "");
const address = await resolver("vitalik.eth");
// Resolve all mentions in a message
const resolved = await resolveMentionsInMessage(
ctx.message.content,
await ctx.conversation.members()
);
// Returns: { "bankr.eth": "0x...", "@fabri": "0x..." }
// Get Farcaster profile via web3.bio API
const profile = await fetchFarcasterProfile("dwr.eth");
console.log(profile.username, profile.fid);
Extract mentions from text:
const extractMentions = (message: string): string[] => {
const mentions: string[] = [];
// Full addresses
const addresses = message.match(/(0x[a-fA-F0-9]{40})\b/g);
if (addresses) mentions.push(...addresses);
// @mentions and domains
const atMentions = message.match(/@(?!0x)([\w.-]+\.eth|[\w.-]+)/g);
if (atMentions) mentions.push(...atMentions.map(m => m.slice(1)));
// Standalone domains
const domains = message.match(/\b([\w-]+(?:\.[\w-]+)*\.eth)\b/g);
if (domains) mentions.push(...domains);
return [...new Set(mentions)];
};
Resolve mentions in message:
import { createNameResolver } from "@xmtp/agent-sdk";
const resolveMentionsInMessage = async (
message: string, members?: GroupMember[]
): Promise<Record<string, string | null>> => {
const resolver = createNameResolver(process.env.WEB3_BIO_API_KEY || "");
const mentions = extractMentions(message);
const results: Record<string, string | null> = {};
await Promise.all(mentions.map(async (mention) => {
if (mention.match(/^0x[a-fA-F0-9]{40}$/)) {
results[mention] = mention;
} else {
const name = mention.includes(".") ? mention : `${mention}.farcaster.eth`;
results[mention] = await resolver(name).catch(() => null);
}
}));
return results;
};
Fetch Farcaster profile:
const fetchFarcasterProfile = async (name: string) => {
const response = await fetch(`https://api.web3.bio/profile/${encodeURIComponent(name)}`);
if (!response.ok) return { address: null, username: null, fid: null };
const data = await response.json();
const profile = data?.find((p: any) => p.platform === "farcaster");
return {
address: profile?.address,
username: profile?.displayName,
fid: profile?.social?.uid?.toString(),
};
};
Read individual rule files for detailed explanations:
rules/resolve-address.md
rules/extract-mentions.md
rules/profiles-farcaster.md
development
Emoji reactions and thinking indicators for XMTP agents. Use when adding reactions to messages or showing processing state with thinking emoji. Triggers on emoji reactions, thinking indicator, or message acknowledgment.
data-ai
Group conversation management for XMTP agents. Use when creating groups, managing members, setting permissions, or sending welcome messages. Triggers on group creation, member management, or permissions.
data-ai
Token transactions and wallet integration for XMTP agents. Use when sending USDC, creating transaction requests, or handling transaction confirmations. Triggers on USDC transfer, wallet calls, or transaction reference.
data-ai
Patterns for handling commands, validating input, and filtering messages in XMTP agents. Use when implementing slash commands, validators, or message filters. Triggers on command handling, input validation, or type guards.