[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H1W4SDVEJ8MSTZYPRD32T2":3,"skill-same:01M6H1W4SDVEJ8MSTZYPRD32T2":83},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M6H1W4SDVEJ8MSTZYPRD32T2","resolving-domains",null,"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.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fsocial\u002Fxmtp-agent\u002Fresolving-domains\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"resolving domains","domains","ens resolution","when","for","xmtp agents","ens","profiles","extracting","triggers","identity","farcaster","resolution","domain","identity resolution","use","lookup","web3","extraction","2026-11-10 10:12:30",false,"---\nname: resolving-domains\ndescription: 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.\nlicense: MIT\nmetadata:\n  author: xmtp\n  version: \"1.0.0\"\n---\n\n# XMTP domain resolver\n\nResolve Web3 identities including ENS, Farcaster, Basenames, and Lens Protocol.\n\n## When to apply\n\nReference these guidelines when:\n- Resolving ENS names to addresses\n- Extracting @mentions from messages\n- Fetching Farcaster profiles\n- Working with shortened addresses in groups\n\n## Rule categories by priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 1 | Resolve | HIGH | `resolve-` |\n| 2 | Extract | HIGH | `extract-` |\n| 3 | Profiles | MEDIUM | `profiles-` |\n\n## Quick reference\n\n### Resolve (HIGH)\n- `resolve-address` - Resolve domain names to addresses\n- `resolve-mentions` - Resolve all mentions in a message\n\n### Extract (HIGH)\n- `extract-mentions` - Extract @mentions from text\n\n### Profiles (MEDIUM)\n- `profiles-farcaster` - Fetch Farcaster profile data\n\n## Supported platforms\n\n- **ENS** - `vitalik.eth`\n- **Farcaster** - `dwr.eth`, `username.farcaster.eth`\n- **Basenames** - `tony.base.eth`\n- **Lens Protocol** - `stani.lens`\n\n## Quick start\n\n```typescript\nimport { createNameResolver } from \"@xmtp\u002Fagent-sdk\u002Fuser\";\n\n\u002F\u002F Resolve a single name using the SDK resolver\nconst resolver = createNameResolver(process.env.WEB3_BIO_API_KEY || \"\");\nconst address = await resolver(\"vitalik.eth\");\n\n\u002F\u002F Resolve all mentions in a message\nconst resolved = await resolveMentionsInMessage(\n  ctx.message.content,\n  await ctx.conversation.members()\n);\n\u002F\u002F Returns: { \"bankr.eth\": \"0x...\", \"@fabri\": \"0x...\" }\n\n\u002F\u002F Get Farcaster profile via web3.bio API\nconst profile = await fetchFarcasterProfile(\"dwr.eth\");\nconsole.log(profile.username, profile.fid);\n```\n\n## Implementation snippets\n\n**Extract mentions from text:**\n\n```typescript\nconst extractMentions = (message: string): string[] => {\n  const mentions: string[] = [];\n  \n  \u002F\u002F Full addresses\n  const addresses = message.match(\u002F(0x[a-fA-F0-9]{40})\\b\u002Fg);\n  if (addresses) mentions.push(...addresses);\n  \n  \u002F\u002F @mentions and domains\n  const atMentions = message.match(\u002F@(?!0x)([\\w.-]+\\.eth|[\\w.-]+)\u002Fg);\n  if (atMentions) mentions.push(...atMentions.map(m => m.slice(1)));\n  \n  \u002F\u002F Standalone domains\n  const domains = message.match(\u002F\\b([\\w-]+(?:\\.[\\w-]+)*\\.eth)\\b\u002Fg);\n  if (domains) mentions.push(...domains);\n  \n  return [...new Set(mentions)];\n};\n```\n\n**Resolve mentions in message:**\n\n```typescript\nimport { createNameResolver } from \"@xmtp\u002Fagent-sdk\u002Fuser\";\n\nconst resolveMentionsInMessage = async (\n  message: string, members?: GroupMember[]\n): Promise\u003CRecord\u003Cstring, string | null>> => {\n  const resolver = createNameResolver(process.env.WEB3_BIO_API_KEY || \"\");\n  const mentions = extractMentions(message);\n  const results: Record\u003Cstring, string | null> = {};\n  \n  await Promise.all(mentions.map(async (mention) => {\n    if (mention.match(\u002F^0x[a-fA-F0-9]{40}$\u002F)) {\n      results[mention] = mention;\n    } else {\n      const name = mention.includes(\".\") ? mention : `${mention}.farcaster.eth`;\n      results[mention] = await resolver(name).catch(() => null);\n    }\n  }));\n  return results;\n};\n```\n\n**Fetch Farcaster profile:**\n\n```typescript\nconst fetchFarcasterProfile = async (name: string) => {\n  const response = await fetch(`https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002F${encodeURIComponent(name)}`);\n  if (!response.ok) return { address: null, username: null, fid: null };\n  const data = await response.json();\n  const profile = data?.find((p: any) => p.platform === \"farcaster\");\n  return {\n    address: profile?.address,\n    username: profile?.displayName,\n    fid: profile?.social?.uid?.toString(),\n  };\n};\n```\n\n## How to use\n\nRead individual rule files for detailed explanations:\n\n```\nrules\u002Fresolve-address.md\nrules\u002Fextract-mentions.md\nrules\u002Fprofiles-farcaster.md\n```\n\n","# XMTP domain resolver\n\nResolve Web3 identities including ENS, Farcaster, Basenames, and Lens Protocol.\n\n## When to apply\n\nReference these guidelines when:\n- Resolving ENS names to addresses\n- Extracting @mentions from messages\n- Fetching Farcaster profiles\n- Working with shortened addresses in groups\n\n## Rule categories by priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 1 | Resolve | HIGH | `resolve-` |\n| 2 | Extract | HIGH | `extract-` |\n| 3 | Profiles | MEDIUM | `profiles-` |\n\n## Quick reference\n\n### Resolve (HIGH)\n- `resolve-address` - Resolve domain names to addresses\n- `resolve-mentions` - Resolve all mentions in a message\n\n### Extract (HIGH)\n- `extract-mentions` - Extract @mentions from text\n\n### Profiles (MEDIUM)\n- `profiles-farcaster` - Fetch Farcaster profile data\n\n## Supported platforms\n\n- **ENS** - `vitalik.eth`\n- **Farcaster** - `dwr.eth`, `username.farcaster.eth`\n- **Basenames** - `tony.base.eth`\n- **Lens Protocol** - `stani.lens`\n\n## Quick start\n\n```typescript\nimport { createNameResolver } from \"@xmtp\u002Fagent-sdk\u002Fuser\";\n\n\u002F\u002F Resolve a single name using the SDK resolver\nconst resolver = createNameResolver(process.env.WEB3_BIO_API_KEY || \"\");\nconst address = await resolver(\"vitalik.eth\");\n\n\u002F\u002F Resolve all mentions in a message\nconst resolved = await resolveMentionsInMessage(\n  ctx.message.content,\n  await ctx.conversation.members()\n);\n\u002F\u002F Returns: { \"bankr.eth\": \"0x...\", \"@fabri\": \"0x...\" }\n\n\u002F\u002F Get Farcaster profile via web3.bio API\nconst profile = await fetchFarcasterProfile(\"dwr.eth\");\nconsole.log(profile.username, profile.fid);\n```\n\n## Implementation snippets\n\n**Extract mentions from text:**\n\n```typescript\nconst extractMentions = (message: string): string[] => {\n  const mentions: string[] = [];\n  \n  \u002F\u002F Full addresses\n  const addresses = message.match(\u002F(0x[a-fA-F0-9]{40})\\b\u002Fg);\n  if (addresses) mentions.push(...addresses);\n  \n  \u002F\u002F @mentions and domains\n  const atMentions = message.match(\u002F@(?!0x)([\\w.-]+\\.eth|[\\w.-]+)\u002Fg);\n  if (atMentions) mentions.push(...atMentions.map(m => m.slice(1)));\n  \n  \u002F\u002F Standalone domains\n  const domains = message.match(\u002F\\b([\\w-]+(?:\\.[\\w-]+)*\\.eth)\\b\u002Fg);\n  if (domains) mentions.push(...domains);\n  \n  return [...new Set(mentions)];\n};\n```\n\n**Resolve mentions in message:**\n\n```typescript\nimport { createNameResolver } from \"@xmtp\u002Fagent-sdk\u002Fuser\";\n\nconst resolveMentionsInMessage = async (\n  message: string, members?: GroupMember[]\n): Promise\u003CRecord\u003Cstring, string | null>> => {\n  const resolver = createNameResolver(process.env.WEB3_BIO_API_KEY || \"\");\n  const mentions = extractMentions(message);\n  const results: Record\u003Cstring, string | null> = {};\n  \n  await Promise.all(mentions.map(async (mention) => {\n    if (mention.match(\u002F^0x[a-fA-F0-9]{40}$\u002F)) {\n      results[mention] = mention;\n    } else {\n      const name = mention.includes(\".\") ? mention : `${mention}.farcaster.eth`;\n      results[mention] = await resolver(name).catch(() => null);\n    }\n  }));\n  return results;\n};\n```\n\n**Fetch Farcaster profile:**\n\n```typescript\nconst fetchFarcasterProfile = async (name: string) => {\n  const response = await fetch(`https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002F${encodeURIComponent(name)}`);\n  if (!response.ok) return { address: null, username: null, fid: null };\n  const data = await response.json();\n  const profile = data?.find((p: any) => p.platform === \"farcaster\");\n  return {\n    address: profile?.address,\n    username: profile?.displayName,\n    fid: profile?.social?.uid?.toString(),\n  };\n};\n```\n\n## How to use\n\nRead individual rule files for detailed explanations:\n\n```\nrules\u002Fresolve-address.md\nrules\u002Fextract-mentions.md\nrules\u002Fprofiles-farcaster.md\n```\n\n",{"name":5,"license":15,"metadata":43,"description":7},{"author":44,"version":45},"xmtp","1.0.0","main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fsocial\u002Fxmtp-agent\u002Fresolving-domains",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-14 02:27:51",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill resolving-domains",{"tool":61,"command":62},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill resolving-domains",{"tool":64,"command":65},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill resolving-domains","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fsocial\u002Fxmtp-agent\u002Fresolving-domains\u002FSKILL.md",true,[69,75,79],{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"rules\u002Fextract-mentions.md","REFERENCE","参考文档",1421,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fsocial\u002Fxmtp-agent\u002Fresolving-domains\u002Frules\u002Fextract-mentions.md",{"path":76,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":77,"sourceHtmlUrl":78},"rules\u002Fprofiles-farcaster.md",1513,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fsocial\u002Fxmtp-agent\u002Fresolving-domains\u002Frules\u002Fprofiles-farcaster.md",{"path":80,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":81,"sourceHtmlUrl":82},"rules\u002Fresolve-address.md",1298,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fsocial\u002Fxmtp-agent\u002Fresolving-domains\u002Frules\u002Fresolve-address.md",[84,112,134,152,165,175],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":88,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":38},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":116,"licenseFileUrl":117,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":38},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[121,122,123,124,125,126,127,128,129,130,23,131,132,133],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","api keys","maintenance","protobuf",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":116,"licenseFileUrl":138,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":38},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[142,122,143,144,145,146,147,131,23,130,148,149,150,126,151,125,124],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":116,"licenseFileUrl":156,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":38},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[160,161,123,162,163,132,23,164,129,128,126,125],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":166,"name":167,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":168,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":38},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[172,173,174],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":179,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":38},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[183,184,185,186,187,188,189,34,190,191,192],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]