协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
resolving-domains【开发与工程】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.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
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/user";
// 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/user";
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