{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ens-skill",
    "name": "ENS (Ethereum Name Service)",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/fabriziogianni7/ens-skill",
    "canonicalUrl": "https://clawhub.ai/fabriziogianni7/ens-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ens-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ens-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ens-skill"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ens-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/ens-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ens-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ens-skill/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "What this skill does",
        "body": "Enables Gundwane to:\n\nResolve ENS names to Ethereum addresses (forward resolution)\nResolve addresses to ENS names (reverse resolution)\nLook up ENS profiles (avatar, social records, text records)\nHelp users register, renew, and manage .eth names on Ethereum mainnet"
      },
      {
        "title": "When to use",
        "body": "User mentions any .eth name: \"send to vitalik.eth\", \"look up nick.eth\", \"who is luc.eth\"\nDisplaying wallet addresses to the user — show the ENS primary name alongside the address\nUser asks \"what's my ENS?\", \"do I have an ENS name?\", \"set my ENS\"\nUser asks to register a new .eth name, renew an existing one, or update records\nUser sends to or receives from an .eth address"
      },
      {
        "title": "ENS Name Detection",
        "body": "Any token matching *.eth in user input is likely an ENS name. Examples:\n\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\nAlways resolve before using. Never pass a .eth name directly to LI.FI or transaction tools — resolve to a 0x address first."
      },
      {
        "title": "Forward Resolution (Name → Address)",
        "body": "Use curl to resolve an ENS name to its Ethereum address. Try in priority order.\n\nApproach 1: ENS Subgraph (The Graph)\n\nBest for detailed data (expiry, registrant, resolver). Requires GRAPH_API_KEY env var.\n\ncurl -s -X POST \\\n  --url \"https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"query\":\"{ domains(where: { name: \\\"vitalik.eth\\\" }) { name resolvedAddress { id } expiryDate registration { registrant { id } expiryDate } } }\"}'\n\nResponse: data.domains[0].resolvedAddress.id = the 0x address.\n\nApproach 2: web3.bio API (free, no key needed)\n\nGood for quick resolution + profile data in one call.\n\ncurl -s \"https://api.web3.bio/profile/vitalik.eth\"\n\nReturns JSON with address, identity, displayName, avatar, description, and linked social profiles. Use the address field for the resolved 0x address.\n\nApproach 3: Node.js with viem (fallback)\n\nIf APIs are down and node is available (viem is in the project deps):\n\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem/chains';\nimport { normalize } from 'viem/ens';\nconst c = createPublicClient({ chain: mainnet, transport: http('https://eth.llamarpc.com') });\nconst addr = await c.getEnsAddress({ name: normalize('REPLACE_NAME') });\nconsole.log(JSON.stringify({ address: addr }));\n\"\n\nReplace REPLACE_NAME with the actual ENS name.\n\nPriority: Approach 1 → 2 → 3. Use whichever is available and fastest."
      },
      {
        "title": "Reverse Resolution (Address → Name)",
        "body": "Given a 0x address, find the primary ENS name.\n\nVia ENS Subgraph\n\ncurl -s -X POST \\\n  --url \"https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"query\":\"{ domains(where: { resolvedAddress: \\\"0xd8da6bf26964af9d7eed9e03e53415d37aa96045\\\" }) { name } }\"}'\n\nNote: address must be lowercase in the query.\n\nVia web3.bio\n\ncurl -s \"https://api.web3.bio/profile/0xd8da6bf26964af9d7eed9e03e53415d37aa96045\"\n\nReturns ENS name and profile if a primary name is set.\n\nVia viem (fallback)\n\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem/chains';\nconst c = createPublicClient({ chain: mainnet, transport: http('https://eth.llamarpc.com') });\nconst name = await c.getEnsName({ address: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' });\nconsole.log(JSON.stringify({ name }));\n\""
      },
      {
        "title": "Profile Lookup",
        "body": "Get ENS profile details: avatar, description, social links, text records.\n\ncurl -s \"https://api.web3.bio/profile/nick.eth\"\n\nCommon text record keys (for reference):\n\ncom.twitter — Twitter/X handle\ncom.github — GitHub username\nurl — Website\nemail — Email address\navatar — Avatar URL or NFT reference\ndescription — Bio/description\ncom.discord — Discord handle"
      },
      {
        "title": "ENS Avatar URL",
        "body": "Direct avatar image:\n\nhttps://metadata.ens.domains/mainnet/avatar/{name}\n\nExample: https://metadata.ens.domains/mainnet/avatar/nick.eth\n\nUse this URL when displaying a user's ENS avatar in messages."
      },
      {
        "title": "When showing addresses",
        "body": "After getting a user's wallet via defi_get_wallet, optionally check for a reverse ENS name.\nIf user has a primary ENS name, display it: fabri.eth (0xabc...def)\nIn portfolio views, prefer the ENS name when available.\nDon't resolve on every message — cache the result for the session."
      },
      {
        "title": "When resolving for transactions",
        "body": "Always confirm the resolved address before executing:\nvitalik.eth → 0xd8dA...6045\nSend 0.1 ETH to this address?\n\n\nNever blindly trust resolution — ENS records can change. Always show the 0x address."
      },
      {
        "title": "In transaction summaries",
        "body": "Use both: 0.1 ETH → vitalik.eth (0xd8d...6045) on Base"
      },
      {
        "title": ".eth Name Registration",
        "body": "Registration 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\nPricing:\n\n5+ characters: $5/year in ETH\n4 characters: $160/year in ETH\n3 characters: $640/year in ETH\n\nContracts (Mainnet):\n\nContractAddressENS Registry0x00000000000C2E074eC69A0dFb2997BA6C7d2e1eETH Registrar Controller0x253553366Da8546fC250F225fe3d25d0C782303bPublic Resolver0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63Reverse Registrar0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7CbName Wrapper0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401Universal Resolver0xce01f8eee7E479C928F8919abD53E553a36CeF67"
      },
      {
        "title": "Check Availability",
        "body": "Via the ENS subgraph:\n\ncurl -s -X POST \\\n  --url \"https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"query\":\"{ registrations(where: { labelName: \\\"myname\\\" }) { labelName expiryDate } }\"}'\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://ens.app/myname.eth"
      },
      {
        "title": "Registration Flow",
        "body": "Registration uses a 2-step commit/reveal process (prevents front-running):\n\nCheck availability (subgraph query above).\nCheck price: ~$5/year for 5+ char names. Current ETH price determines the exact cost.\nPresent summary:\nRegister myname.eth:\n• Cost: ~0.002 ETH ($5) for 1 year\n• Chain: Ethereum mainnet\n• 2-step process (~2 min total)\n\nRegister?\n\n\nStep 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.\nWait 60 seconds (tell the user: \"Commitment submitted. Registration completes in ~1 minute.\").\nStep 2 — Register: Call register(name, owner, duration, secret, resolver, data, reverseRecord, fuses) with the name price as value.\nConfirm: myname.eth registered! Yours for 1 year (expires Feb 2027). [View tx](...)\nStore in strategy and suggest setting a primary name.\n\nSimpler alternative: Direct the user to the ENS Manager App for registration: https://ens.app/myname.eth — this handles the full flow with a nice UI. Recommend this for first-time registrations."
      },
      {
        "title": "Renewal",
        "body": "Simpler than registration — single transaction, no commit step.\n\nWhen user says \"renew myname.eth\":\n\nLook up current expiry via subgraph or strategy.\nGet renewal price (same as registration pricing).\nPresent summary:\nRenew myname.eth:\n• Current expiry: Feb 8, 2027\n• Cost: ~0.002 ETH ($5) for 1 year\n• New expiry: Feb 8, 2028\n\n\nOn 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).\nUpdate expiry in strategy.\n\nGrace 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."
      },
      {
        "title": "Set Primary Name (Reverse Record)",
        "body": "When user says \"set my ENS primary name\" or \"make myname.eth my primary\":\n\nCall setName(string name) on the Reverse Registrar (0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb) via defi_send_transaction on mainnet (chainId: 1).\nThis makes the user's address resolve to myname.eth in reverse lookups.\nThe user must own the name and it must point to their address."
      },
      {
        "title": "Set Text Records",
        "body": "Update social/text records via the Public Resolver (0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63):\n\nFunction: setText(bytes32 node, string key, string value)\nThe node is the namehash of the full name.\nCommon keys: com.twitter, com.github, url, email, avatar, description\n\nFor complex record updates, recommend the ENS Manager App: https://ens.app/myname.eth"
      },
      {
        "title": "Expiry Monitoring",
        "body": "Store registered ENS names in the user's strategy for heartbeat monitoring:\n\n{\n  \"ensNames\": [\n    {\n      \"name\": \"fabri.eth\",\n      \"expiry\": \"2027-02-08T00:00:00Z\",\n      \"isPrimary\": true\n    }\n  ]\n}\n\nDuring heartbeats, check ensNames from each user's strategy:\n\n30 days before expiry: \"Your name fabri.eth expires in 30 days. Want to renew?\"\n7 days before expiry: \"fabri.eth expires in 7 days. Renew now to keep it.\"\nExpired (in grace period): \"fabri.eth expired! You have 90 days to renew before it's released.\""
      },
      {
        "title": "Data Storage — Strategy JSON",
        "body": "ENS data is stored per-user in strategy JSON (via defi_set_strategy):\n\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\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."
      },
      {
        "title": "Rules",
        "body": "Always resolve before transacting. Never pass .eth names to LI.FI or transaction tools. Resolve to a 0x address first.\nConfirm resolved address. Always show the user the resolved 0x address before sending funds. ENS records can change.\nMainnet only for registration/renewal. .eth names live on Ethereum mainnet. Flag if user needs to bridge ETH for gas + fees.\nNo permission for lookups. ENS resolution and profile lookups are read operations — do them silently.\nCache within session. If you resolve a name in a conversation, reuse the result. Don't re-resolve every message.\nHandle failures gracefully. If resolution fails (name doesn't exist, API down), tell the user clearly. Never guess an address.\nMonitor expiry during heartbeats. Check ensNames in user strategies. Alert before names expire.\nPer-user isolation. ENS data lives in the user's strategy JSON. Never cross-read.\nSuggest ENS once. If user doesn't have an ENS name and frequently uses their raw address, mention ENS once. Don't push it.\nENSv2 awareness. ENS is migrating to a new L2-based system (ENSv2). Current mainnet registration still works. Be aware this may change."
      }
    ],
    "body": "ENS (Ethereum Name Service) — Skill\nWhat this skill does\n\nEnables Gundwane to:\n\nResolve ENS names to Ethereum addresses (forward resolution)\nResolve addresses to ENS names (reverse resolution)\nLook up ENS profiles (avatar, social records, text records)\nHelp users register, renew, and manage .eth names on Ethereum mainnet\nWhen to use\nUser mentions any .eth name: \"send to vitalik.eth\", \"look up nick.eth\", \"who is luc.eth\"\nDisplaying wallet addresses to the user — show the ENS primary name alongside the address\nUser asks \"what's my ENS?\", \"do I have an ENS name?\", \"set my ENS\"\nUser asks to register a new .eth name, renew an existing one, or update records\nUser sends to or receives from an .eth address\nENS Name Detection\n\nAny token matching *.eth in user input is likely an ENS name. Examples:\n\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\nAlways resolve before using. Never pass a .eth name directly to LI.FI or transaction tools — resolve to a 0x address first.\n\nResolution\nForward Resolution (Name → Address)\n\nUse curl to resolve an ENS name to its Ethereum address. Try in priority order.\n\nApproach 1: ENS Subgraph (The Graph)\n\nBest for detailed data (expiry, registrant, resolver). Requires GRAPH_API_KEY env var.\n\ncurl -s -X POST \\\n  --url \"https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application/json' \\\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\nApproach 2: web3.bio API (free, no key needed)\n\nGood for quick resolution + profile data in one call.\n\ncurl -s \"https://api.web3.bio/profile/vitalik.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\nApproach 3: Node.js with viem (fallback)\n\nIf APIs are down and node is available (viem is in the project deps):\n\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem/chains';\nimport { normalize } from 'viem/ens';\nconst c = createPublicClient({ chain: mainnet, transport: http('https://eth.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\nPriority: Approach 1 → 2 → 3. Use whichever is available and fastest.\n\nReverse Resolution (Address → Name)\n\nGiven a 0x address, find the primary ENS name.\n\nVia ENS Subgraph\ncurl -s -X POST \\\n  --url \"https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"query\":\"{ domains(where: { resolvedAddress: \\\"0xd8da6bf26964af9d7eed9e03e53415d37aa96045\\\" }) { name } }\"}'\n\n\nNote: address must be lowercase in the query.\n\nVia web3.bio\ncurl -s \"https://api.web3.bio/profile/0xd8da6bf26964af9d7eed9e03e53415d37aa96045\"\n\n\nReturns ENS name and profile if a primary name is set.\n\nVia viem (fallback)\nnode --input-type=module -e \"\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem/chains';\nconst c = createPublicClient({ chain: mainnet, transport: http('https://eth.llamarpc.com') });\nconst name = await c.getEnsName({ address: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' });\nconsole.log(JSON.stringify({ name }));\n\"\n\nProfile Lookup\n\nGet ENS profile details: avatar, description, social links, text records.\n\ncurl -s \"https://api.web3.bio/profile/nick.eth\"\n\n\nCommon text record keys (for reference):\n\ncom.twitter — Twitter/X handle\ncom.github — GitHub username\nurl — Website\nemail — Email address\navatar — Avatar URL or NFT reference\ndescription — Bio/description\ncom.discord — Discord handle\nENS Avatar URL\n\nDirect avatar image:\n\nhttps://metadata.ens.domains/mainnet/avatar/{name}\n\n\nExample: https://metadata.ens.domains/mainnet/avatar/nick.eth\n\nUse this URL when displaying a user's ENS avatar in messages.\n\nDisplay Rules\nWhen showing addresses\nAfter getting a user's wallet via defi_get_wallet, optionally check for a reverse ENS name.\nIf user has a primary ENS name, display it: fabri.eth (0xabc...def)\nIn portfolio views, prefer the ENS name when available.\nDon't resolve on every message — cache the result for the session.\nWhen resolving for transactions\nAlways confirm the resolved address before executing:\nvitalik.eth → 0xd8dA...6045\nSend 0.1 ETH to this address?\n\nNever blindly trust resolution — ENS records can change. Always show the 0x address.\nIn transaction summaries\nUse both: 0.1 ETH → vitalik.eth (0xd8d...6045) on Base\nRegistration\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\nPricing:\n\n5+ characters: $5/year in ETH\n4 characters: $160/year in ETH\n3 characters: $640/year in ETH\n\nContracts (Mainnet):\n\nContract\tAddress\nENS Registry\t0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\nETH Registrar Controller\t0x253553366Da8546fC250F225fe3d25d0C782303b\nPublic Resolver\t0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63\nReverse Registrar\t0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb\nName Wrapper\t0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401\nUniversal Resolver\t0xce01f8eee7E479C928F8919abD53E553a36CeF67\nCheck Availability\n\nVia the ENS subgraph:\n\ncurl -s -X POST \\\n  --url \"https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH\" \\\n  --header 'Content-Type: application/json' \\\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://ens.app/myname.eth\n\nRegistration Flow\n\nRegistration uses a 2-step commit/reveal process (prevents front-running):\n\nCheck availability (subgraph query above).\nCheck price: ~$5/year for 5+ char names. Current ETH price determines the exact cost.\nPresent summary:\nRegister myname.eth:\n• Cost: ~0.002 ETH ($5) for 1 year\n• Chain: Ethereum mainnet\n• 2-step process (~2 min total)\n\nRegister?\n\nStep 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.\nWait 60 seconds (tell the user: \"Commitment submitted. Registration completes in ~1 minute.\").\nStep 2 — Register: Call register(name, owner, duration, secret, resolver, data, reverseRecord, fuses) with the name price as value.\nConfirm: myname.eth registered! Yours for 1 year (expires Feb 2027). [View tx](...)\nStore in strategy and suggest setting a primary name.\n\nSimpler alternative: Direct the user to the ENS Manager App for registration: https://ens.app/myname.eth — this handles the full flow with a nice UI. Recommend this for first-time registrations.\n\nRenewal\n\nSimpler than registration — single transaction, no commit step.\n\nWhen user says \"renew myname.eth\":\n\nLook up current expiry via subgraph or strategy.\nGet renewal price (same as registration pricing).\nPresent summary:\nRenew myname.eth:\n• Current expiry: Feb 8, 2027\n• Cost: ~0.002 ETH ($5) for 1 year\n• New expiry: Feb 8, 2028\n\nOn 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).\nUpdate expiry in strategy.\n\nGrace 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\nSetting Records\nSet Primary Name (Reverse Record)\n\nWhen user says \"set my ENS primary name\" or \"make myname.eth my primary\":\n\nCall setName(string name) on the Reverse Registrar (0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb) via defi_send_transaction on mainnet (chainId: 1).\nThis makes the user's address resolve to myname.eth in reverse lookups.\nThe user must own the name and it must point to their address.\nSet Text Records\n\nUpdate social/text records via the Public Resolver (0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63):\n\nFunction: setText(bytes32 node, string key, string value)\nThe node is the namehash of the full name.\nCommon keys: com.twitter, com.github, url, email, avatar, description\n\nFor complex record updates, recommend the ENS Manager App: https://ens.app/myname.eth\n\nExpiry Monitoring\n\nStore registered ENS names in the user's strategy for heartbeat monitoring:\n\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\n30 days before expiry: \"Your name fabri.eth expires in 30 days. Want to renew?\"\n7 days before expiry: \"fabri.eth expires in 7 days. Renew now to keep it.\"\nExpired (in grace period): \"fabri.eth expired! You have 90 days to renew before it's released.\"\nData Storage — Strategy JSON\n\nENS data is stored per-user in strategy JSON (via defi_set_strategy):\n\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\nRules\nAlways resolve before transacting. Never pass .eth names to LI.FI or transaction tools. Resolve to a 0x address first.\nConfirm resolved address. Always show the user the resolved 0x address before sending funds. ENS records can change.\nMainnet only for registration/renewal. .eth names live on Ethereum mainnet. Flag if user needs to bridge ETH for gas + fees.\nNo permission for lookups. ENS resolution and profile lookups are read operations — do them silently.\nCache within session. If you resolve a name in a conversation, reuse the result. Don't re-resolve every message.\nHandle failures gracefully. If resolution fails (name doesn't exist, API down), tell the user clearly. Never guess an address.\nMonitor expiry during heartbeats. Check ensNames in user strategies. Alert before names expire.\nPer-user isolation. ENS data lives in the user's strategy JSON. Never cross-read.\nSuggest ENS once. If user doesn't have an ENS name and frequently uses their raw address, mention ENS once. Don't push it.\nENSv2 awareness. ENS is migrating to a new L2-based system (ENSv2). Current mainnet registration still works. Be aware this may change."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/fabriziogianni7/ens-skill",
    "publisherUrl": "https://clawhub.ai/fabriziogianni7/ens-skill",
    "owner": "fabriziogianni7",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ens-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/ens-skill",
    "agentUrl": "https://openagent3.xyz/skills/ens-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ens-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ens-skill/agent.md"
  }
}