{
  "schemaVersion": "1.0",
  "item": {
    "slug": "nadfun-skill",
    "name": "Nadfun Skill",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/zaki9501/nadfun-skill",
    "canonicalUrl": "https://clawhub.ai/zaki9501/nadfun-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/nadfun-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=nadfun-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/nadfun-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/nadfun-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/nadfun-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nadfun-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nadfun-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": "NadFun Integration Guide",
        "body": "Monad blockchain token launchpad with bonding curves. Trade tokens, launch your own, monitor events—all with pure viem."
      },
      {
        "title": "Skills",
        "body": "ModulePurposeURLskill.mdArchitecture, constants, setupnad.fun/skill.mdABI.mdSmart contract ABIsnad.fun/abi.mdQUOTE.mdPrice quotes, curve statenad.fun/quote.mdTRADING.mdBuy, sell, permit signaturesnad.fun/trading.mdTOKEN.mdBalances, metadata, transfersnad.fun/token.mdCREATE.mdToken creation, image uploadnad.fun/create.mdINDEXER.mdHistorical event queryingnad.fun/indexer.mdAGENT-API.mdREST API, API key managementnad.fun/agent-api.mdWALLET.mdWallet generationnad.fun/wallet.mdAUSD.mdLiFi swap (MON → aUSD) + Upshift vaultnad.fun/ausd.md"
      },
      {
        "title": "Network Constants",
        "body": "const NETWORK = \"testnet\" // 'testnet' | 'mainnet'\n\nconst CONFIG = {\n  testnet: {\n    chainId: 10143,\n    rpcUrl: \"https://monad-testnet.drpc.org\",\n    apiUrl: \"https://dev-api.nad.fun\",\n    DEX_ROUTER: \"0x5D4a4f430cA3B1b2dB86B9cFE48a5316800F5fb2\",\n    BONDING_CURVE_ROUTER: \"0x865054F0F6A288adaAc30261731361EA7E908003\",\n    LENS: \"0xB056d79CA5257589692699a46623F901a3BB76f1\",\n    CURVE: \"0x1228b0dc9481C11D3071E7A924B794CfB038994e\",\n    WMON: \"0x5a4E0bFDeF88C9032CB4d24338C5EB3d3870BfDd\",\n    V3_FACTORY: \"0xd0a37cf728CE2902eB8d4F6f2afc76854048253b\",\n    CREATOR_TREASURY: \"0x24dFf9B68fA36f8400302e2babC3e049eA19459E\",\n  },\n  mainnet: {\n    chainId: 143,\n    rpcUrl: \"https://monad-mainnet.drpc.org\",\n    apiUrl: \"https://api.nadapp.net\",\n    DEX_ROUTER: \"0x0B79d71AE99528D1dB24A4148b5f4F865cc2b137\",\n    BONDING_CURVE_ROUTER: \"0x6F6B8F1a20703309951a5127c45B49b1CD981A22\",\n    LENS: \"0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea\",\n    CURVE: \"0xA7283d07812a02AFB7C09B60f8896bCEA3F90aCE\",\n    WMON: \"0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A\",\n    V3_FACTORY: \"0x6B5F564339DbAD6b780249827f2198a841FEB7F3\",\n    CREATOR_TREASURY: \"0x42e75B4B96d7000E7Da1e0c729Cec8d2049B9731\",\n  },\n}[NETWORK]"
      },
      {
        "title": "Basic Setup",
        "body": "import { createPublicClient, createWalletClient, http } from \"viem\"\nimport { privateKeyToAccount } from \"viem/accounts\"\n\nconst chain = {\n  id: CONFIG.chainId,\n  name: \"Monad\",\n  nativeCurrency: { name: \"MON\", symbol: \"MON\", decimals: 18 },\n  rpcUrls: { default: { http: [CONFIG.rpcUrl] } },\n}\n\nconst account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)\n\nconst publicClient = createPublicClient({\n  chain,\n  transport: http(CONFIG.rpcUrl),\n})\n\nconst walletClient = createWalletClient({\n  account,\n  chain,\n  transport: http(CONFIG.rpcUrl),\n})"
      },
      {
        "title": "Bonding Curve",
        "body": "Tokens start on a bonding curve. Price increases as more buy. Check state with getCurveState(token)."
      },
      {
        "title": "Graduation",
        "body": "When target reserves reached: curve → Uniswap V3 DEX. Check isGraduated(token) or getProgress(token) (0-10000 = 0-100%)."
      },
      {
        "title": "Permit Signatures (EIP-2612)",
        "body": "Sign approval off-chain for gasless approve: generatePermitSignature() → use in sellPermit()."
      },
      {
        "title": "Action IDs",
        "body": "Always use actionId: 1 for token creation."
      },
      {
        "title": "Authentication (Login Flow)",
        "body": "Login is NOT required for any functionality. All trading, token creation, and queries work without login.\n\nLogin is ONLY needed to manage API keys (create/list/delete). See AGENT-API.md for:\n\nRate limits (10 req/min without key, 100 req/min with key)\nAPI key CRUD operations\n\nCookie name: nadfun-v3-api\n\n// 1. Request nonce\nconst { nonce } = await fetch(`${CONFIG.apiUrl}/auth/nonce`, {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ address: account.address }),\n}).then((r) => r.json())\n\n// 2. Sign nonce\nconst signature = await walletClient.signMessage({ message: nonce })\n\n// 3. Create session\nconst sessionRes = await fetch(`${CONFIG.apiUrl}/auth/session`, {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ signature, nonce, chain_id: CONFIG.chainId }),\n})\n// Cookie: nadfun-v3-api=<token>\nconst cookies = sessionRes.headers.get(\"set-cookie\")\n\n// 4. Use session for API key management\nawait fetch(`${CONFIG.apiUrl}/api-key`, {\n  headers: { Cookie: cookies },\n})"
      },
      {
        "title": "Common Pitfalls",
        "body": "Gas estimation: Always estimateContractGas() before sending. Never hardcode gas limits.\nDeadline: Must be future timestamp. Use BigInt(Math.floor(Date.now() / 1000) + 300) (5 min).\nSlippage: Calculate amountOutMin with buffer. (amountOut * 99n) / 100n = 1% slippage.\nPermit nonce: Fetch immediately before signing. Stale nonce = tx revert."
      },
      {
        "title": "Common ABI Errors",
        "body": "ErrorMeaningInsufficientAmountOutput < amountOutMinDeadlineExpiredDeadline passedAlreadyGraduatedToken on DEXBondingCurveLockedCurve locked during graduationInvalidProofBad merkle proof (claims)"
      },
      {
        "title": "Installation",
        "body": "npm install viem"
      }
    ],
    "body": "NadFun Integration Guide\n\nMonad blockchain token launchpad with bonding curves. Trade tokens, launch your own, monitor events—all with pure viem.\n\nSkills\nModule\tPurpose\tURL\nskill.md\tArchitecture, constants, setup\tnad.fun/skill.md\nABI.md\tSmart contract ABIs\tnad.fun/abi.md\nQUOTE.md\tPrice quotes, curve state\tnad.fun/quote.md\nTRADING.md\tBuy, sell, permit signatures\tnad.fun/trading.md\nTOKEN.md\tBalances, metadata, transfers\tnad.fun/token.md\nCREATE.md\tToken creation, image upload\tnad.fun/create.md\nINDEXER.md\tHistorical event querying\tnad.fun/indexer.md\nAGENT-API.md\tREST API, API key management\tnad.fun/agent-api.md\nWALLET.md\tWallet generation\tnad.fun/wallet.md\nAUSD.md\tLiFi swap (MON → aUSD) + Upshift vault\tnad.fun/ausd.md\nNetwork Constants\nconst NETWORK = \"testnet\" // 'testnet' | 'mainnet'\n\nconst CONFIG = {\n  testnet: {\n    chainId: 10143,\n    rpcUrl: \"https://monad-testnet.drpc.org\",\n    apiUrl: \"https://dev-api.nad.fun\",\n    DEX_ROUTER: \"0x5D4a4f430cA3B1b2dB86B9cFE48a5316800F5fb2\",\n    BONDING_CURVE_ROUTER: \"0x865054F0F6A288adaAc30261731361EA7E908003\",\n    LENS: \"0xB056d79CA5257589692699a46623F901a3BB76f1\",\n    CURVE: \"0x1228b0dc9481C11D3071E7A924B794CfB038994e\",\n    WMON: \"0x5a4E0bFDeF88C9032CB4d24338C5EB3d3870BfDd\",\n    V3_FACTORY: \"0xd0a37cf728CE2902eB8d4F6f2afc76854048253b\",\n    CREATOR_TREASURY: \"0x24dFf9B68fA36f8400302e2babC3e049eA19459E\",\n  },\n  mainnet: {\n    chainId: 143,\n    rpcUrl: \"https://monad-mainnet.drpc.org\",\n    apiUrl: \"https://api.nadapp.net\",\n    DEX_ROUTER: \"0x0B79d71AE99528D1dB24A4148b5f4F865cc2b137\",\n    BONDING_CURVE_ROUTER: \"0x6F6B8F1a20703309951a5127c45B49b1CD981A22\",\n    LENS: \"0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea\",\n    CURVE: \"0xA7283d07812a02AFB7C09B60f8896bCEA3F90aCE\",\n    WMON: \"0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A\",\n    V3_FACTORY: \"0x6B5F564339DbAD6b780249827f2198a841FEB7F3\",\n    CREATOR_TREASURY: \"0x42e75B4B96d7000E7Da1e0c729Cec8d2049B9731\",\n  },\n}[NETWORK]\n\nBasic Setup\nimport { createPublicClient, createWalletClient, http } from \"viem\"\nimport { privateKeyToAccount } from \"viem/accounts\"\n\nconst chain = {\n  id: CONFIG.chainId,\n  name: \"Monad\",\n  nativeCurrency: { name: \"MON\", symbol: \"MON\", decimals: 18 },\n  rpcUrls: { default: { http: [CONFIG.rpcUrl] } },\n}\n\nconst account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)\n\nconst publicClient = createPublicClient({\n  chain,\n  transport: http(CONFIG.rpcUrl),\n})\n\nconst walletClient = createWalletClient({\n  account,\n  chain,\n  transport: http(CONFIG.rpcUrl),\n})\n\nCore Concepts\nBonding Curve\n\nTokens start on a bonding curve. Price increases as more buy. Check state with getCurveState(token).\n\nGraduation\n\nWhen target reserves reached: curve → Uniswap V3 DEX. Check isGraduated(token) or getProgress(token) (0-10000 = 0-100%).\n\nPermit Signatures (EIP-2612)\n\nSign approval off-chain for gasless approve: generatePermitSignature() → use in sellPermit().\n\nAction IDs\n\nAlways use actionId: 1 for token creation.\n\nAuthentication (Login Flow)\n\nLogin is NOT required for any functionality. All trading, token creation, and queries work without login.\n\nLogin is ONLY needed to manage API keys (create/list/delete). See AGENT-API.md for:\n\nRate limits (10 req/min without key, 100 req/min with key)\nAPI key CRUD operations\n\nCookie name: nadfun-v3-api\n\n// 1. Request nonce\nconst { nonce } = await fetch(`${CONFIG.apiUrl}/auth/nonce`, {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ address: account.address }),\n}).then((r) => r.json())\n\n// 2. Sign nonce\nconst signature = await walletClient.signMessage({ message: nonce })\n\n// 3. Create session\nconst sessionRes = await fetch(`${CONFIG.apiUrl}/auth/session`, {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ signature, nonce, chain_id: CONFIG.chainId }),\n})\n// Cookie: nadfun-v3-api=<token>\nconst cookies = sessionRes.headers.get(\"set-cookie\")\n\n// 4. Use session for API key management\nawait fetch(`${CONFIG.apiUrl}/api-key`, {\n  headers: { Cookie: cookies },\n})\n\nCommon Pitfalls\nGas estimation: Always estimateContractGas() before sending. Never hardcode gas limits.\nDeadline: Must be future timestamp. Use BigInt(Math.floor(Date.now() / 1000) + 300) (5 min).\nSlippage: Calculate amountOutMin with buffer. (amountOut * 99n) / 100n = 1% slippage.\nPermit nonce: Fetch immediately before signing. Stale nonce = tx revert.\nCommon ABI Errors\nError\tMeaning\nInsufficientAmount\tOutput < amountOutMin\nDeadlineExpired\tDeadline passed\nAlreadyGraduated\tToken on DEX\nBondingCurveLocked\tCurve locked during graduation\nInvalidProof\tBad merkle proof (claims)\nInstallation\nnpm install viem"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/zaki9501/nadfun-skill",
    "publisherUrl": "https://clawhub.ai/zaki9501/nadfun-skill",
    "owner": "zaki9501",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/nadfun-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/nadfun-skill",
    "agentUrl": "https://openagent3.xyz/skills/nadfun-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nadfun-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nadfun-skill/agent.md"
  }
}