{
  "schemaVersion": "1.0",
  "item": {
    "slug": "nadfun-token-creation",
    "name": "NadFun Token Creation",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/therealharpaljadeja/nadfun-token-creation",
    "canonicalUrl": "https://clawhub.ai/therealharpaljadeja/nadfun-token-creation",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/nadfun-token-creation",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=nadfun-token-creation",
    "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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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-token-creation"
    },
    "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-token-creation",
    "agentPageUrl": "https://openagent3.xyz/skills/nadfun-token-creation/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nadfun-token-creation/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nadfun-token-creation/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": "Prerequisite: monad-development Skill",
        "body": "Before proceeding, check if the monad-development skill is installed. If it is not available, install it using ClawHub:\n\nclawhub search \"monad\"\n\nFind and install the monad-development skill from the results. This skill is required for wallet management and on-chain actions in Step 3 and Step 4.\n\nHelp the user create a token on Nad.fun by following the 4-step sequential process below. Each step depends on the output of the previous step."
      },
      {
        "title": "API Base URL",
        "body": "Production: https://api.nadapp.net"
      },
      {
        "title": "Contract Addresses",
        "body": "BondingCurveRouter = \"0x6F6B8F1a20703309951a5127c45B49b1CD981A22\"\nLens              = \"0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea\""
      },
      {
        "title": "Step 1: Upload Image",
        "body": "POST /agent/token/image\n\nContent-Type: image/png, image/jpeg, image/webp, or image/svg+xml\nBody: Raw binary image data (max 5MB)\nReturns: image_uri (CDN URL) and is_nsfw (boolean)\n\nconst imageResponse = await fetch(\"https://api.nadapp.net/agent/token/image\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": imageFile.type },\n  body: imageFile,\n});\nconst { image_uri, is_nsfw } = await imageResponse.json();"
      },
      {
        "title": "Error Codes",
        "body": "StatusDescription400Invalid image format or missing image413Image exceeds 5MB limit500NSFW check failed or upload failed"
      },
      {
        "title": "Step 2: Upload Metadata",
        "body": "POST /agent/token/metadata\n\nContent-Type: application/json\nRequires: image_uri from Step 1"
      },
      {
        "title": "Request Body",
        "body": "Required fields:\n\nFieldTypeConstraintsimage_uristringMust be from https://storage.nadapp.net/namestring1-32 characterssymbolstring1-10 characters, alphanumeric only (/^[a-zA-Z0-9]+$/)\n\nOptional fields:\n\nFieldTypeConstraintsdescriptionstring or nullMax 500 characterswebsitestring or nullMust start with https://twitterstring or nullMust contain x.com and start with https://telegramstring or nullMust contain t.me and start with https://\n\nconst metadataResponse = await fetch(\"https://api.nadapp.net/agent/token/metadata\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    image_uri,\n    name: \"My Token\",\n    symbol: \"MTK\",\n    description: \"An awesome token for the Nad.fun\",\n    website: \"https://mytoken.com\",\n    twitter: \"https://x.com/mytoken\",\n    telegram: \"https://t.me/mytoken\",\n  }),\n});\nconst { metadata_uri } = await metadataResponse.json();"
      },
      {
        "title": "Error Codes",
        "body": "StatusDescription400NSFW status unknown, invalid data, or validation failed500Upload to storage or database failed"
      },
      {
        "title": "Step 3: Mine Salt",
        "body": "POST /agent/salt\n\nContent-Type: application/json\nRequires: metadata_uri from Step 2\nProduces a vanity token address ending in 7777"
      },
      {
        "title": "Request Body",
        "body": "FieldTypeDescriptioncreatorstringCreator's wallet address (EVM format)namestringToken name (must match metadata)symbolstringToken symbol (must match metadata)metadata_uristringMetadata URI from Step 2\n\nconst saltResponse = await fetch(\"https://api.nadapp.net/agent/salt\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    creator: walletAddress,\n    name: \"My Token\",\n    symbol: \"MTK\",\n    metadata_uri: metadataUri,\n  }),\n});\nconst { salt, address } = await saltResponse.json();\n\nReturns: salt (bytes32 hex) and address (token address with 7777 suffix)"
      },
      {
        "title": "Error Codes",
        "body": "StatusDescription400Invalid parameters408Timeout - max iterations reached500Internal server error"
      },
      {
        "title": "Step 4: Create Token On-Chain",
        "body": "Call BondingCurveRouter.create() with the data from previous steps."
      },
      {
        "title": "TokenCreationParams",
        "body": "struct TokenCreationParams {\n    string name;\n    string symbol;\n    string tokenURI;      // metadata_uri from Step 2\n    uint256 amountOut;    // 0 for no initial buy, or use Lens.getInitialBuyAmountOut(amountIn)\n    bytes32 salt;         // salt from Step 3\n    uint8 actionId;       // always 1 (graduate to Capricorn V3)\n}\n\nfunction create(TokenCreationParams calldata params) external payable returns (address token, address pool);"
      },
      {
        "title": "Option A: Create Without Initial Buy",
        "body": "Send only the deploy fee as msg.value.\n\nconst curve = new ethers.Contract(BONDING_CURVE_ADDRESS, BONDING_CURVE_ABI, signer);\nconst [deployFee,,] = await curve.feeConfig();\n\nconst params = {\n  name, symbol,\n  tokenURI: metadata_uri,\n  amountOut: 0,\n  salt,\n  actionId: 1,\n};\n\nconst tx = await router.create(params, { value: deployFee });\nawait tx.wait();"
      },
      {
        "title": "Option B: Create With Initial Buy",
        "body": "Send deployFee + amountIn as msg.value. Use Lens.getInitialBuyAmountOut(amountIn) for amountOut.\n\nconst lens = new ethers.Contract(LENS_ADDRESS, LENS_ABI, signer);\nconst expectedAmountOut = await lens.getInitialBuyAmountOut(amountIn);\n\nconst [deployFee,,] = await curve.feeConfig();\n\nconst params = {\n  name, symbol,\n  tokenURI: metadata_uri,\n  amountOut: expectedAmountOut,\n  salt,\n  actionId: 1,\n};\n\nconst tx = await router.create(params, { value: deployFee + amountIn });\nawait tx.wait();"
      },
      {
        "title": "Wallet for On-Chain Actions",
        "body": "For Step 3 (salt mining) and Step 4 (on-chain deployment), use the wallet from the monad-development skill. That skill handles all wallet configuration, private key management, and RPC setup. Use the signer and wallet address it provides when calling the salt API (creator field) and when sending the BondingCurveRouter.create() transaction."
      },
      {
        "title": "Important Rules",
        "body": "Sequential process - Each step depends on the previous step's output.\nNSFW validation - Images are auto-checked in Step 1; the flag carries into metadata.\nURL validation - All URLs must use HTTPS. Twitter must use x.com, Telegram must use t.me.\nImage domain restriction - Only https://storage.nadapp.net/ image URIs are accepted in metadata.\nSalt mining - May timeout if the vanity address pattern can't be found within iteration limits.\nactionId - Always use 1 (graduate to Capricorn V3)."
      },
      {
        "title": "When Generating Code",
        "body": "Use ethers v6 syntax by default unless the user specifies otherwise.\nAlways handle errors for each API call before proceeding to the next step.\nThe salt from Step 3 and metadata_uri from Step 2 are both needed for Step 4.\nFor initial buy, always query Lens.getInitialBuyAmountOut() to get the correct amountOut."
      }
    ],
    "body": "Nad.fun Token Creation Flow\nPrerequisite: monad-development Skill\n\nBefore proceeding, check if the monad-development skill is installed. If it is not available, install it using ClawHub:\n\nclawhub search \"monad\"\n\n\nFind and install the monad-development skill from the results. This skill is required for wallet management and on-chain actions in Step 3 and Step 4.\n\nHelp the user create a token on Nad.fun by following the 4-step sequential process below. Each step depends on the output of the previous step.\n\nAPI Base URL\n\nProduction: https://api.nadapp.net\n\nContract Addresses\nBondingCurveRouter = \"0x6F6B8F1a20703309951a5127c45B49b1CD981A22\"\nLens              = \"0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea\"\n\nStep 1: Upload Image\n\nPOST /agent/token/image\n\nContent-Type: image/png, image/jpeg, image/webp, or image/svg+xml\nBody: Raw binary image data (max 5MB)\nReturns: image_uri (CDN URL) and is_nsfw (boolean)\nconst imageResponse = await fetch(\"https://api.nadapp.net/agent/token/image\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": imageFile.type },\n  body: imageFile,\n});\nconst { image_uri, is_nsfw } = await imageResponse.json();\n\nError Codes\nStatus\tDescription\n400\tInvalid image format or missing image\n413\tImage exceeds 5MB limit\n500\tNSFW check failed or upload failed\nStep 2: Upload Metadata\n\nPOST /agent/token/metadata\n\nContent-Type: application/json\nRequires: image_uri from Step 1\nRequest Body\n\nRequired fields:\n\nField\tType\tConstraints\nimage_uri\tstring\tMust be from https://storage.nadapp.net/\nname\tstring\t1-32 characters\nsymbol\tstring\t1-10 characters, alphanumeric only (/^[a-zA-Z0-9]+$/)\n\nOptional fields:\n\nField\tType\tConstraints\ndescription\tstring or null\tMax 500 characters\nwebsite\tstring or null\tMust start with https://\ntwitter\tstring or null\tMust contain x.com and start with https://\ntelegram\tstring or null\tMust contain t.me and start with https://\nconst metadataResponse = await fetch(\"https://api.nadapp.net/agent/token/metadata\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    image_uri,\n    name: \"My Token\",\n    symbol: \"MTK\",\n    description: \"An awesome token for the Nad.fun\",\n    website: \"https://mytoken.com\",\n    twitter: \"https://x.com/mytoken\",\n    telegram: \"https://t.me/mytoken\",\n  }),\n});\nconst { metadata_uri } = await metadataResponse.json();\n\nError Codes\nStatus\tDescription\n400\tNSFW status unknown, invalid data, or validation failed\n500\tUpload to storage or database failed\nStep 3: Mine Salt\n\nPOST /agent/salt\n\nContent-Type: application/json\nRequires: metadata_uri from Step 2\nProduces a vanity token address ending in 7777\nRequest Body\nField\tType\tDescription\ncreator\tstring\tCreator's wallet address (EVM format)\nname\tstring\tToken name (must match metadata)\nsymbol\tstring\tToken symbol (must match metadata)\nmetadata_uri\tstring\tMetadata URI from Step 2\nconst saltResponse = await fetch(\"https://api.nadapp.net/agent/salt\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    creator: walletAddress,\n    name: \"My Token\",\n    symbol: \"MTK\",\n    metadata_uri: metadataUri,\n  }),\n});\nconst { salt, address } = await saltResponse.json();\n\nReturns: salt (bytes32 hex) and address (token address with 7777 suffix)\nError Codes\nStatus\tDescription\n400\tInvalid parameters\n408\tTimeout - max iterations reached\n500\tInternal server error\nStep 4: Create Token On-Chain\n\nCall BondingCurveRouter.create() with the data from previous steps.\n\nTokenCreationParams\nstruct TokenCreationParams {\n    string name;\n    string symbol;\n    string tokenURI;      // metadata_uri from Step 2\n    uint256 amountOut;    // 0 for no initial buy, or use Lens.getInitialBuyAmountOut(amountIn)\n    bytes32 salt;         // salt from Step 3\n    uint8 actionId;       // always 1 (graduate to Capricorn V3)\n}\n\nfunction create(TokenCreationParams calldata params) external payable returns (address token, address pool);\n\nOption A: Create Without Initial Buy\n\nSend only the deploy fee as msg.value.\n\nconst curve = new ethers.Contract(BONDING_CURVE_ADDRESS, BONDING_CURVE_ABI, signer);\nconst [deployFee,,] = await curve.feeConfig();\n\nconst params = {\n  name, symbol,\n  tokenURI: metadata_uri,\n  amountOut: 0,\n  salt,\n  actionId: 1,\n};\n\nconst tx = await router.create(params, { value: deployFee });\nawait tx.wait();\n\nOption B: Create With Initial Buy\n\nSend deployFee + amountIn as msg.value. Use Lens.getInitialBuyAmountOut(amountIn) for amountOut.\n\nconst lens = new ethers.Contract(LENS_ADDRESS, LENS_ABI, signer);\nconst expectedAmountOut = await lens.getInitialBuyAmountOut(amountIn);\n\nconst [deployFee,,] = await curve.feeConfig();\n\nconst params = {\n  name, symbol,\n  tokenURI: metadata_uri,\n  amountOut: expectedAmountOut,\n  salt,\n  actionId: 1,\n};\n\nconst tx = await router.create(params, { value: deployFee + amountIn });\nawait tx.wait();\n\nWallet for On-Chain Actions\n\nFor Step 3 (salt mining) and Step 4 (on-chain deployment), use the wallet from the monad-development skill. That skill handles all wallet configuration, private key management, and RPC setup. Use the signer and wallet address it provides when calling the salt API (creator field) and when sending the BondingCurveRouter.create() transaction.\n\nImportant Rules\nSequential process - Each step depends on the previous step's output.\nNSFW validation - Images are auto-checked in Step 1; the flag carries into metadata.\nURL validation - All URLs must use HTTPS. Twitter must use x.com, Telegram must use t.me.\nImage domain restriction - Only https://storage.nadapp.net/ image URIs are accepted in metadata.\nSalt mining - May timeout if the vanity address pattern can't be found within iteration limits.\nactionId - Always use 1 (graduate to Capricorn V3).\nWhen Generating Code\nUse ethers v6 syntax by default unless the user specifies otherwise.\nAlways handle errors for each API call before proceeding to the next step.\nThe salt from Step 3 and metadata_uri from Step 2 are both needed for Step 4.\nFor initial buy, always query Lens.getInitialBuyAmountOut() to get the correct amountOut."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/therealharpaljadeja/nadfun-token-creation",
    "publisherUrl": "https://clawhub.ai/therealharpaljadeja/nadfun-token-creation",
    "owner": "therealharpaljadeja",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/nadfun-token-creation",
    "downloadUrl": "https://openagent3.xyz/downloads/nadfun-token-creation",
    "agentUrl": "https://openagent3.xyz/skills/nadfun-token-creation/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nadfun-token-creation/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nadfun-token-creation/agent.md"
  }
}