[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FNBAWQS4W7JHMTDXSBZ1RC":3,"skill-same:01M6FNBAWQS4W7JHMTDXSBZ1RC":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6FNBAWQS4W7JHMTDXSBZ1RC","ens",null,"Resolve ENS names (.eth) to Ethereum addresses and vice versa. Use when a user provides an .eth name (e.g. \"send to vitalik.eth\"), when displaying addresses (show ENS names), looking up ENS profiles, or helping users register, renew, or manage .eth names.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Ffabriziogianni7\u002Fens-skill\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31],"docs","https","ethereum","user","use","up","manage","show","eth","name","register","domains","users","profiles","2026-11-10 10:12:30",false,"---\nname: ens\ndescription: Resolve ENS names (.eth) to Ethereum addresses and vice versa. Use when a user provides an .eth name (e.g. \"send to vitalik.eth\"), when displaying addresses (show ENS names), looking up ENS profiles, or helping users register, renew, or manage .eth names.\nhomepage: https:\u002F\u002Fdocs.ens.domains\u002F\nmetadata:\n  openclaw:\n    emoji: \"?️\"\n    requires: { env: [] }\n---\n\n# ENS (Ethereum Name Service) — Skill\n\n## What this skill does\n\nEnables Gundwane to:\n1. **Resolve ENS names** to Ethereum addresses (forward resolution)\n2. **Resolve addresses** to ENS names (reverse resolution)\n3. **Look up ENS profiles** (avatar, social records, text records)\n4. **Help users register, renew, and manage** .eth names on Ethereum mainnet\n\n## When to use\n\n- User mentions any `.eth` name: \"send to vitalik.eth\", \"look up nick.eth\", \"who is luc.eth\"\n- Displaying wallet addresses to the user — show the ENS primary name alongside the address\n- User asks \"what's my ENS?\", \"do I have an ENS name?\", \"set my ENS\"\n- User asks to register a new .eth name, renew an existing one, or update records\n- User sends to or receives from an `.eth` address\n\n## ENS Name Detection\n\nAny token matching `*.eth` in user input is likely an ENS name. Examples:\n- \"send 0.1 ETH to vitalik.eth\" → resolve `vitalik.eth`\n- \"what's the address for nick.eth?\" → resolve `nick.eth`\n- \"register myname.eth\" → check availability for `myname`\n\n**Always resolve before using.** Never pass a `.eth` name directly to LI.FI or transaction tools — resolve to a `0x` address first.\n\n## Resolution\n\n### Forward Resolution (Name → Address)\n\nUse `curl` to resolve an ENS name to its Ethereum address. Try in priority order.\n\n#### Approach 1: ENS Subgraph (The Graph)\n\nBest for detailed data (expiry, registrant, resolver). Requires `GRAPH_API_KEY` env var.\n\n```bash\ncurl -s -X POST \\\n  --url \"https:\u002F\u002Fgateway.thegraph.com\u002Fapi\u002F$GRAPH_API_KEY\u002Fsubgraphs\u002Fid\u002F5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\"query\":\"{ domains(where: { name: \\\"vitalik.eth\\\" }) { name resolvedAddress { id } expiryDate registration { registrant { id } expiryDate } } }\"}'\n```\n\nResponse: `data.domains[0].resolvedAddress.id` = the `0x` address.\n\n#### Approach 2: web3.bio API (free, no key needed)\n\nGood for quick resolution + profile data in one call.\n\n```bash\ncurl -s \"https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002Fvitalik.eth\"\n```\n\nReturns JSON with `address`, `identity`, `displayName`, `avatar`, `description`, and linked social profiles. Use the `address` field for the resolved `0x` address.\n\n#### Approach 3: Node.js with viem (fallback)\n\nIf APIs are down and `node` is available (viem is in the project deps):\n\n```bash\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem\u002Fchains';\nimport { normalize } from 'viem\u002Fens';\nconst c = createPublicClient({ chain: mainnet, transport: http('https:\u002F\u002Feth.llamarpc.com') });\nconst addr = await c.getEnsAddress({ name: normalize('REPLACE_NAME') });\nconsole.log(JSON.stringify({ address: addr }));\n\"\n```\n\nReplace `REPLACE_NAME` with the actual ENS name.\n\n**Priority:** Approach 1 → 2 → 3. Use whichever is available and fastest.\n\n### Reverse Resolution (Address → Name)\n\nGiven a `0x` address, find the primary ENS name.\n\n#### Via ENS Subgraph\n\n```bash\ncurl -s -X POST \\\n  --url \"https:\u002F\u002Fgateway.thegraph.com\u002Fapi\u002F$GRAPH_API_KEY\u002Fsubgraphs\u002Fid\u002F5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\"query\":\"{ domains(where: { resolvedAddress: \\\"0xd8da6bf26964af9d7eed9e03e53415d37aa96045\\\" }) { name } }\"}'\n```\n\nNote: address must be **lowercase** in the query.\n\n#### Via web3.bio\n\n```bash\ncurl -s \"https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002F0xd8da6bf26964af9d7eed9e03e53415d37aa96045\"\n```\n\nReturns ENS name and profile if a primary name is set.\n\n#### Via viem (fallback)\n\n```bash\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem\u002Fchains';\nconst c = createPublicClient({ chain: mainnet, transport: http('https:\u002F\u002Feth.llamarpc.com') });\nconst name = await c.getEnsName({ address: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' });\nconsole.log(JSON.stringify({ name }));\n\"\n```\n\n### Profile Lookup\n\nGet ENS profile details: avatar, description, social links, text records.\n\n```bash\ncurl -s \"https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002Fnick.eth\"\n```\n\nCommon text record keys (for reference):\n- `com.twitter` — Twitter\u002FX handle\n- `com.github` — GitHub username\n- `url` — Website\n- `email` — Email address\n- `avatar` — Avatar URL or NFT reference\n- `description` — Bio\u002Fdescription\n- `com.discord` — Discord handle\n\n### ENS Avatar URL\n\nDirect avatar image:\n```\nhttps:\u002F\u002Fmetadata.ens.domains\u002Fmainnet\u002Favatar\u002F{name}\n```\n\nExample: `https:\u002F\u002Fmetadata.ens.domains\u002Fmainnet\u002Favatar\u002Fnick.eth`\n\nUse this URL when displaying a user's ENS avatar in messages.\n\n## Display Rules\n\n### When showing addresses\n- After getting a user's wallet via `defi_get_wallet`, optionally check for a reverse ENS name.\n- If user has a primary ENS name, display it: `fabri.eth (0xabc...def)`\n- In portfolio views, prefer the ENS name when available.\n- Don't resolve on every message — cache the result for the session.\n\n### When resolving for transactions\n- **Always confirm the resolved address** before executing:\n  ```\n  vitalik.eth → 0xd8dA...6045\n  Send 0.1 ETH to this address?\n  ```\n- Never blindly trust resolution — ENS records can change. Always show the `0x` address.\n\n### In transaction summaries\n- Use both: `0.1 ETH → vitalik.eth (0xd8d...6045) on Base`\n\n## Registration\n\n### .eth Name Registration\n\nRegistration happens on **Ethereum mainnet only**. Requires ETH for the name price + gas. If the user's ETH is on L2, flag that they need to bridge first.\n\n**Pricing:**\n- 5+ characters: $5\u002Fyear in ETH\n- 4 characters: $160\u002Fyear in ETH\n- 3 characters: $640\u002Fyear in ETH\n\n**Contracts (Mainnet):**\n| Contract | Address |\n|----------|---------|\n| ENS Registry | `0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e` |\n| ETH Registrar Controller | `0x253553366Da8546fC250F225fe3d25d0C782303b` |\n| Public Resolver | `0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63` |\n| Reverse Registrar | `0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb` |\n| Name Wrapper | `0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401` |\n| Universal Resolver | `0xce01f8eee7E479C928F8919abD53E553a36CeF67` |\n\n### Check Availability\n\nVia the ENS subgraph:\n\n```bash\ncurl -s -X POST \\\n  --url \"https:\u002F\u002Fgateway.thegraph.com\u002Fapi\u002F$GRAPH_API_KEY\u002Fsubgraphs\u002Fid\u002F5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\"query\":\"{ registrations(where: { labelName: \\\"myname\\\" }) { labelName expiryDate } }\"}'\n```\n\nIf no result or `expiryDate` is in the past (+ 90 day grace period), the name is available.\n\nOr link the user to check directly: `https:\u002F\u002Fens.app\u002Fmyname.eth`\n\n### Registration Flow\n\nRegistration uses a 2-step commit\u002Freveal process (prevents front-running):\n\n1. **Check availability** (subgraph query above).\n2. **Check price**: ~$5\u002Fyear for 5+ char names. Current ETH price determines the exact cost.\n3. **Present summary**:\n   ```\n   Register myname.eth:\n   • Cost: ~0.002 ETH ($5) for 1 year\n   • Chain: Ethereum mainnet\n   • 2-step process (~2 min total)\n\n   Register?\n   ```\n4. **Step 1 — Commit**: Call `commit(bytes32)` on the ETH Registrar Controller via `defi_send_transaction` (chainId: 1). The commitment hash must be computed from the name, owner address, duration, and a random secret.\n5. **Wait 60 seconds** (tell the user: \"Commitment submitted. Registration completes in ~1 minute.\").\n6. **Step 2 — Register**: Call `register(name, owner, duration, secret, resolver, data, reverseRecord, fuses)` with the name price as `value`.\n7. **Confirm**: `myname.eth registered! Yours for 1 year (expires Feb 2027). [View tx](...)`\n8. **Store in strategy** and suggest setting a primary name.\n\n**Simpler alternative:** Direct the user to the ENS Manager App for registration: `https:\u002F\u002Fens.app\u002Fmyname.eth` — this handles the full flow with a nice UI. Recommend this for first-time registrations.\n\n## Renewal\n\nSimpler than registration — single transaction, no commit step.\n\nWhen user says \"renew myname.eth\":\n\n1. Look up current expiry via subgraph or strategy.\n2. Get renewal price (same as registration pricing).\n3. Present summary:\n   ```\n   Renew myname.eth:\n   • Current expiry: Feb 8, 2027\n   • Cost: ~0.002 ETH ($5) for 1 year\n   • New expiry: Feb 8, 2028\n   ```\n4. On approval: Call `renew(string name, uint256 duration)` on the ETH Registrar Controller via `defi_send_transaction` (chainId: 1) with the renewal price as `value`. Duration in seconds (1 year = 31536000).\n5. Update expiry in strategy.\n\n**Grace period:** Names have a 90-day grace period after expiry. Only the original owner can renew during this window. After grace period, name goes to public auction with a temporary premium that decreases over 21 days.\n\n## Setting Records\n\n### Set Primary Name (Reverse Record)\n\nWhen user says \"set my ENS primary name\" or \"make myname.eth my primary\":\n- Call `setName(string name)` on the Reverse Registrar (`0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb`) via `defi_send_transaction` on mainnet (chainId: 1).\n- This makes the user's address resolve to `myname.eth` in reverse lookups.\n- The user must own the name and it must point to their address.\n\n### Set Text Records\n\nUpdate social\u002Ftext records via the Public Resolver (`0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63`):\n- Function: `setText(bytes32 node, string key, string value)`\n- The `node` is the namehash of the full name.\n- Common keys: `com.twitter`, `com.github`, `url`, `email`, `avatar`, `description`\n\nFor complex record updates, recommend the ENS Manager App: `https:\u002F\u002Fens.app\u002Fmyname.eth`\n\n## Expiry Monitoring\n\nStore registered ENS names in the user's strategy for heartbeat monitoring:\n\n```json\n{\n  \"ensNames\": [\n    {\n      \"name\": \"fabri.eth\",\n      \"expiry\": \"2027-02-08T00:00:00Z\",\n      \"isPrimary\": true\n    }\n  ]\n}\n```\n\nDuring heartbeats, check `ensNames` from each user's strategy:\n- **30 days before expiry**: \"Your name fabri.eth expires in 30 days. Want to renew?\"\n- **7 days before expiry**: \"fabri.eth expires in 7 days. Renew now to keep it.\"\n- **Expired (in grace period)**: \"fabri.eth expired! You have 90 days to renew before it's released.\"\n\n## Data Storage — Strategy JSON\n\nENS data is stored per-user in strategy JSON (via `defi_set_strategy`):\n\n```json\n{\n  \"ensNames\": [\n    {\n      \"name\": \"fabri.eth\",\n      \"expiry\": \"2027-02-08T00:00:00Z\",\n      \"isPrimary\": true\n    }\n  ],\n  \"ensPreferences\": {\n    \"showEnsInPortfolio\": true,\n    \"expiryAlertDays\": 30\n  }\n}\n```\n\nRead via `defi_get_strategy`, write via `defi_set_strategy`. Automatically per-user.\n\nNarrative data (e.g., \"resolved vitalik.eth for a 0.1 ETH transfer\") goes to per-user daily memory.\n\n## Rules\n\n1. **Always resolve before transacting.** Never pass `.eth` names to LI.FI or transaction tools. Resolve to a `0x` address first.\n2. **Confirm resolved address.** Always show the user the resolved `0x` address before sending funds. ENS records can change.\n3. **Mainnet only for registration\u002Frenewal.** .eth names live on Ethereum mainnet. Flag if user needs to bridge ETH for gas + fees.\n4. **No permission for lookups.** ENS resolution and profile lookups are read operations — do them silently.\n5. **Cache within session.** If you resolve a name in a conversation, reuse the result. Don't re-resolve every message.\n6. **Handle failures gracefully.** If resolution fails (name doesn't exist, API down), tell the user clearly. Never guess an address.\n7. **Monitor expiry during heartbeats.** Check `ensNames` in user strategies. Alert before names expire.\n8. **Per-user isolation.** ENS data lives in the user's strategy JSON. Never cross-read.\n9. **Suggest ENS once.** If user doesn't have an ENS name and frequently uses their raw address, mention ENS once. Don't push it.\n10. **ENSv2 awareness.** ENS is migrating to a new L2-based system (ENSv2). Current mainnet registration still works. Be aware this may change.\n","# ENS (Ethereum Name Service) — Skill\n\n## What this skill does\n\nEnables Gundwane to:\n1. **Resolve ENS names** to Ethereum addresses (forward resolution)\n2. **Resolve addresses** to ENS names (reverse resolution)\n3. **Look up ENS profiles** (avatar, social records, text records)\n4. **Help users register, renew, and manage** .eth names on Ethereum mainnet\n\n## When to use\n\n- User mentions any `.eth` name: \"send to vitalik.eth\", \"look up nick.eth\", \"who is luc.eth\"\n- Displaying wallet addresses to the user — show the ENS primary name alongside the address\n- User asks \"what's my ENS?\", \"do I have an ENS name?\", \"set my ENS\"\n- User asks to register a new .eth name, renew an existing one, or update records\n- User sends to or receives from an `.eth` address\n\n## ENS Name Detection\n\nAny token matching `*.eth` in user input is likely an ENS name. Examples:\n- \"send 0.1 ETH to vitalik.eth\" → resolve `vitalik.eth`\n- \"what's the address for nick.eth?\" → resolve `nick.eth`\n- \"register myname.eth\" → check availability for `myname`\n\n**Always resolve before using.** Never pass a `.eth` name directly to LI.FI or transaction tools — resolve to a `0x` address first.\n\n## Resolution\n\n### Forward Resolution (Name → Address)\n\nUse `curl` to resolve an ENS name to its Ethereum address. Try in priority order.\n\n#### Approach 1: ENS Subgraph (The Graph)\n\nBest for detailed data (expiry, registrant, resolver). Requires `GRAPH_API_KEY` env var.\n\n```bash\ncurl -s -X POST \\\n  --url \"https:\u002F\u002Fgateway.thegraph.com\u002Fapi\u002F$GRAPH_API_KEY\u002Fsubgraphs\u002Fid\u002F5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\"query\":\"{ domains(where: { name: \\\"vitalik.eth\\\" }) { name resolvedAddress { id } expiryDate registration { registrant { id } expiryDate } } }\"}'\n```\n\nResponse: `data.domains[0].resolvedAddress.id` = the `0x` address.\n\n#### Approach 2: web3.bio API (free, no key needed)\n\nGood for quick resolution + profile data in one call.\n\n```bash\ncurl -s \"https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002Fvitalik.eth\"\n```\n\nReturns JSON with `address`, `identity`, `displayName`, `avatar`, `description`, and linked social profiles. Use the `address` field for the resolved `0x` address.\n\n#### Approach 3: Node.js with viem (fallback)\n\nIf APIs are down and `node` is available (viem is in the project deps):\n\n```bash\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem\u002Fchains';\nimport { normalize } from 'viem\u002Fens';\nconst c = createPublicClient({ chain: mainnet, transport: http('https:\u002F\u002Feth.llamarpc.com') });\nconst addr = await c.getEnsAddress({ name: normalize('REPLACE_NAME') });\nconsole.log(JSON.stringify({ address: addr }));\n\"\n```\n\nReplace `REPLACE_NAME` with the actual ENS name.\n\n**Priority:** Approach 1 → 2 → 3. Use whichever is available and fastest.\n\n### Reverse Resolution (Address → Name)\n\nGiven a `0x` address, find the primary ENS name.\n\n#### Via ENS Subgraph\n\n```bash\ncurl -s -X POST \\\n  --url \"https:\u002F\u002Fgateway.thegraph.com\u002Fapi\u002F$GRAPH_API_KEY\u002Fsubgraphs\u002Fid\u002F5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\"query\":\"{ domains(where: { resolvedAddress: \\\"0xd8da6bf26964af9d7eed9e03e53415d37aa96045\\\" }) { name } }\"}'\n```\n\nNote: address must be **lowercase** in the query.\n\n#### Via web3.bio\n\n```bash\ncurl -s \"https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002F0xd8da6bf26964af9d7eed9e03e53415d37aa96045\"\n```\n\nReturns ENS name and profile if a primary name is set.\n\n#### Via viem (fallback)\n\n```bash\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem\u002Fchains';\nconst c = createPublicClient({ chain: mainnet, transport: http('https:\u002F\u002Feth.llamarpc.com') });\nconst name = await c.getEnsName({ address: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' });\nconsole.log(JSON.stringify({ name }));\n\"\n```\n\n### Profile Lookup\n\nGet ENS profile details: avatar, description, social links, text records.\n\n```bash\ncurl -s \"https:\u002F\u002Fapi.web3.bio\u002Fprofile\u002Fnick.eth\"\n```\n\nCommon text record keys (for reference):\n- `com.twitter` — Twitter\u002FX handle\n- `com.github` — GitHub username\n- `url` — Website\n- `email` — Email address\n- `avatar` — Avatar URL or NFT reference\n- `description` — Bio\u002Fdescription\n- `com.discord` — Discord handle\n\n### ENS Avatar URL\n\nDirect avatar image:\n```\nhttps:\u002F\u002Fmetadata.ens.domains\u002Fmainnet\u002Favatar\u002F{name}\n```\n\nExample: `https:\u002F\u002Fmetadata.ens.domains\u002Fmainnet\u002Favatar\u002Fnick.eth`\n\nUse this URL when displaying a user's ENS avatar in messages.\n\n## Display Rules\n\n### When showing addresses\n- After getting a user's wallet via `defi_get_wallet`, optionally check for a reverse ENS name.\n- If user has a primary ENS name, display it: `fabri.eth (0xabc...def)`\n- In portfolio views, prefer the ENS name when available.\n- Don't resolve on every message — cache the result for the session.\n\n### When resolving for transactions\n- **Always confirm the resolved address** before executing:\n  ```\n  vitalik.eth → 0xd8dA...6045\n  Send 0.1 ETH to this address?\n  ```\n- Never blindly trust resolution — ENS records can change. Always show the `0x` address.\n\n### In transaction summaries\n- Use both: `0.1 ETH → vitalik.eth (0xd8d...6045) on Base`\n\n## Registration\n\n### .eth Name Registration\n\nRegistration happens on **Ethereum mainnet only**. Requires ETH for the name price + gas. If the user's ETH is on L2, flag that they need to bridge first.\n\n**Pricing:**\n- 5+ characters: $5\u002Fyear in ETH\n- 4 characters: $160\u002Fyear in ETH\n- 3 characters: $640\u002Fyear in ETH\n\n**Contracts (Mainnet):**\n| Contract | Address |\n|----------|---------|\n| ENS Registry | `0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e` |\n| ETH Registrar Controller | `0x253553366Da8546fC250F225fe3d25d0C782303b` |\n| Public Resolver | `0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63` |\n| Reverse Registrar | `0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb` |\n| Name Wrapper | `0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401` |\n| Universal Resolver | `0xce01f8eee7E479C928F8919abD53E553a36CeF67` |\n\n### Check Availability\n\nVia the ENS subgraph:\n\n```bash\ncurl -s -X POST \\\n  --url \"https:\u002F\u002Fgateway.thegraph.com\u002Fapi\u002F$GRAPH_API_KEY\u002Fsubgraphs\u002Fid\u002F5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\"query\":\"{ registrations(where: { labelName: \\\"myname\\\" }) { labelName expiryDate } }\"}'\n```\n\nIf no result or `expiryDate` is in the past (+ 90 day grace period), the name is available.\n\nOr link the user to check directly: `https:\u002F\u002Fens.app\u002Fmyname.eth`\n\n### Registration Flow\n\nRegistration uses a 2-step commit\u002Freveal process (prevents front-running):\n\n1. **Check availability** (subgraph query above).\n2. **Check price**: ~$5\u002Fyear for 5+ char names. Current ETH price determines the exact cost.\n3. **Present summary**:\n   ```\n   Register myname.eth:\n   • Cost: ~0.002 ETH ($5) for 1 year\n   • Chain: Ethereum mainnet\n   • 2-step process (~2 min total)\n\n   Register?\n   ```\n4. **Step 1 — Commit**: Call `commit(bytes32)` on the ETH Registrar Controller via `defi_send_transaction` (chainId: 1). The commitment hash must be computed from the name, owner address, duration, and a random secret.\n5. **Wait 60 seconds** (tell the user: \"Commitment submitted. Registration completes in ~1 minute.\").\n6. **Step 2 — Register**: Call `register(name, owner, duration, secret, resolver, data, reverseRecord, fuses)` with the name price as `value`.\n7. **Confirm**: `myname.eth registered! Yours for 1 year (expires Feb 2027). [View tx](...)`\n8. **Store in strategy** and suggest setting a primary name.\n\n**Simpler alternative:** Direct the user to the ENS Manager App for registration: `https:\u002F\u002Fens.app\u002Fmyname.eth` — this handles the full flow with a nice UI. Recommend this for first-time registrations.\n\n## Renewal\n\nSimpler than registration — single transaction, no commit step.\n\nWhen user says \"renew myname.eth\":\n\n1. Look up current expiry via subgraph or strategy.\n2. Get renewal price (same as registration pricing).\n3. Present summary:\n   ```\n   Renew myname.eth:\n   • Current expiry: Feb 8, 2027\n   • Cost: ~0.002 ETH ($5) for 1 year\n   • New expiry: Feb 8, 2028\n   ```\n4. On approval: Call `renew(string name, uint256 duration)` on the ETH Registrar Controller via `defi_send_transaction` (chainId: 1) with the renewal price as `value`. Duration in seconds (1 year = 31536000).\n5. Update expiry in strategy.\n\n**Grace period:** Names have a 90-day grace period after expiry. Only the original owner can renew during this window. After grace period, name goes to public auction with a temporary premium that decreases over 21 days.\n\n## Setting Records\n\n### Set Primary Name (Reverse Record)\n\nWhen user says \"set my ENS primary name\" or \"make myname.eth my primary\":\n- Call `setName(string name)` on the Reverse Registrar (`0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb`) via `defi_send_transaction` on mainnet (chainId: 1).\n- This makes the user's address resolve to `myname.eth` in reverse lookups.\n- The user must own the name and it must point to their address.\n\n### Set Text Records\n\nUpdate social\u002Ftext records via the Public Resolver (`0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63`):\n- Function: `setText(bytes32 node, string key, string value)`\n- The `node` is the namehash of the full name.\n- Common keys: `com.twitter`, `com.github`, `url`, `email`, `avatar`, `description`\n\nFor complex record updates, recommend the ENS Manager App: `https:\u002F\u002Fens.app\u002Fmyname.eth`\n\n## Expiry Monitoring\n\nStore registered ENS names in the user's strategy for heartbeat monitoring:\n\n```json\n{\n  \"ensNames\": [\n    {\n      \"name\": \"fabri.eth\",\n      \"expiry\": \"2027-02-08T00:00:00Z\",\n      \"isPrimary\": true\n    }\n  ]\n}\n```\n\nDuring heartbeats, check `ensNames` from each user's strategy:\n- **30 days before expiry**: \"Your name fabri.eth expires in 30 days. Want to renew?\"\n- **7 days before expiry**: \"fabri.eth expires in 7 days. Renew now to keep it.\"\n- **Expired (in grace period)**: \"fabri.eth expired! You have 90 days to renew before it's released.\"\n\n## Data Storage — Strategy JSON\n\nENS data is stored per-user in strategy JSON (via `defi_set_strategy`):\n\n```json\n{\n  \"ensNames\": [\n    {\n      \"name\": \"fabri.eth\",\n      \"expiry\": \"2027-02-08T00:00:00Z\",\n      \"isPrimary\": true\n    }\n  ],\n  \"ensPreferences\": {\n    \"showEnsInPortfolio\": true,\n    \"expiryAlertDays\": 30\n  }\n}\n```\n\nRead via `defi_get_strategy`, write via `defi_set_strategy`. Automatically per-user.\n\nNarrative data (e.g., \"resolved vitalik.eth for a 0.1 ETH transfer\") goes to per-user daily memory.\n\n## Rules\n\n1. **Always resolve before transacting.** Never pass `.eth` names to LI.FI or transaction tools. Resolve to a `0x` address first.\n2. **Confirm resolved address.** Always show the user the resolved `0x` address before sending funds. ENS records can change.\n3. **Mainnet only for registration\u002Frenewal.** .eth names live on Ethereum mainnet. Flag if user needs to bridge ETH for gas + fees.\n4. **No permission for lookups.** ENS resolution and profile lookups are read operations — do them silently.\n5. **Cache within session.** If you resolve a name in a conversation, reuse the result. Don't re-resolve every message.\n6. **Handle failures gracefully.** If resolution fails (name doesn't exist, API down), tell the user clearly. Never guess an address.\n7. **Monitor expiry during heartbeats.** Check `ensNames` in user strategies. Alert before names expire.\n8. **Per-user isolation.** ENS data lives in the user's strategy JSON. Never cross-read.\n9. **Suggest ENS once.** If user doesn't have an ENS name and frequently uses their raw address, mention ENS once. Don't push it.\n10. **ENSv2 awareness.** ENS is migrating to a new L2-based system (ENSv2). Current mainnet registration still works. Be aware this may change.\n",{"name":5,"homepage":37,"metadata":38,"description":7},"https:\u002F\u002Fdocs.ens.domains\u002F",{"openclaw":39},{"emoji":40,"requires":41},"?️",{"env":42},[],"main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Ffabriziogianni7\u002Fens-skill",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add kbarbel640-del\u002Fskills --skill ens",{"tool":56,"command":57},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill ens",{"tool":59,"command":60},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill ens","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Ffabriziogianni7\u002Fens-skill\u002FSKILL.md",true,[64],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"_meta.json","REFERENCE","参考文档",297,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Ffabriziogianni7\u002Fens-skill\u002F_meta.json",[71,101,129,150,156,176],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":82,"publishedAt":32},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,19,99,100],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","content","ai agents",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":112,"publishedAt":32},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[107],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[113,85,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,90,22],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":138,"publishedAt":32},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000021","资料检索与研究",[139,140,141,142,143,144,145,86,146,127,22,147,85,148,149],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":151,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":155,"publishedAt":32},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[154],{"categoryNo":136,"categoryName":137,"taxonomyType":110,"taxonomyTypeDesc":111},[142,141,140,139,149,144,145,86,143,127,22,146,147,85,148],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":32},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[163,164,165,166,167,168,169,170,171,172,173,174,175],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":186,"publishedAt":32},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[182,183],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},{"categoryNo":184,"categoryName":185,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000037","律师与法务",[187,188,189,190,86,191,192,43,193,147,194,195,196,197,198,19,199,200,201],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]