nadfun-token-creationGuide users through uploading an image and metadata, mining a vanity salt, and deploying a token on-chain via BondingCurveRouter in a 4-step flow on Nad.fun.
Install via ClawdBot CLI:
clawdbot install therealharpaljadeja/nadfun-token-creationBefore proceeding, check if the monad-development skill is installed. If it is not available, install it using ClawHub:
clawhub search "monad"
Find 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.
Help 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.
Production: https://api.nadapp.net
BondingCurveRouter = "0x6F6B8F1a20703309951a5127c45B49b1CD981A22"
Lens = "0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea"
POST /agent/token/image
image/png, image/jpeg, image/webp, or image/svg+xmlimage_uri (CDN URL) and is_nsfw (boolean)const imageResponse = await fetch("https://api.nadapp.net/agent/token/image", {
method: "POST",
headers: { "Content-Type": imageFile.type },
body: imageFile,
});
const { image_uri, is_nsfw } = await imageResponse.json();
| Status | Description |
|--------|-------------|
| 400 | Invalid image format or missing image |
| 413 | Image exceeds 5MB limit |
| 500 | NSFW check failed or upload failed |
POST /agent/token/metadata
application/jsonimage_uri from Step 1Required fields:
| Field | Type | Constraints |
|-------|------|-------------|
| image_uri | string | Must be from https://storage.nadapp.net/ |
| name | string | 1-32 characters |
| symbol | string | 1-10 characters, alphanumeric only (/^[a-zA-Z0-9]+$/) |
Optional fields:
| Field | Type | Constraints |
|-------|------|-------------|
| description | string or null | Max 500 characters |
| website | string or null | Must start with https:// |
| twitter | string or null | Must contain x.com and start with https:// |
| telegram | string or null | Must contain t.me and start with https:// |
const metadataResponse = await fetch("https://api.nadapp.net/agent/token/metadata", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
image_uri,
name: "My Token",
symbol: "MTK",
description: "An awesome token for the Nad.fun",
website: "https://mytoken.com",
twitter: "https://x.com/mytoken",
telegram: "https://t.me/mytoken",
}),
});
const { metadata_uri } = await metadataResponse.json();
| Status | Description |
|--------|-------------|
| 400 | NSFW status unknown, invalid data, or validation failed |
| 500 | Upload to storage or database failed |
POST /agent/salt
application/jsonmetadata_uri from Step 27777| Field | Type | Description |
|-------|------|-------------|
| creator | string | Creator's wallet address (EVM format) |
| name | string | Token name (must match metadata) |
| symbol | string | Token symbol (must match metadata) |
| metadata_uri | string | Metadata URI from Step 2 |
const saltResponse = await fetch("https://api.nadapp.net/agent/salt", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
creator: walletAddress,
name: "My Token",
symbol: "MTK",
metadata_uri: metadataUri,
}),
});
const { salt, address } = await saltResponse.json();
salt (bytes32 hex) and address (token address with 7777 suffix)| Status | Description |
|--------|-------------|
| 400 | Invalid parameters |
| 408 | Timeout - max iterations reached |
| 500 | Internal server error |
Call BondingCurveRouter.create() with the data from previous steps.
struct TokenCreationParams {
string name;
string symbol;
string tokenURI; // metadata_uri from Step 2
uint256 amountOut; // 0 for no initial buy, or use Lens.getInitialBuyAmountOut(amountIn)
bytes32 salt; // salt from Step 3
uint8 actionId; // always 1 (graduate to Capricorn V3)
}
function create(TokenCreationParams calldata params) external payable returns (address token, address pool);
Send only the deploy fee as msg.value.
const curve = new ethers.Contract(BONDING_CURVE_ADDRESS, BONDING_CURVE_ABI, signer);
const [deployFee,,] = await curve.feeConfig();
const params = {
name, symbol,
tokenURI: metadata_uri,
amountOut: 0,
salt,
actionId: 1,
};
const tx = await router.create(params, { value: deployFee });
await tx.wait();
Send deployFee + amountIn as msg.value. Use Lens.getInitialBuyAmountOut(amountIn) for amountOut.
const lens = new ethers.Contract(LENS_ADDRESS, LENS_ABI, signer);
const expectedAmountOut = await lens.getInitialBuyAmountOut(amountIn);
const [deployFee,,] = await curve.feeConfig();
const params = {
name, symbol,
tokenURI: metadata_uri,
amountOut: expectedAmountOut,
salt,
actionId: 1,
};
const tx = await router.create(params, { value: deployFee + amountIn });
await tx.wait();
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.
x.com, Telegram must use t.me.https://storage.nadapp.net/ image URIs are accepted in metadata.1 (graduate to Capricorn V3).ethers v6 syntax by default unless the user specifies otherwise.salt from Step 3 and metadata_uri from Step 2 are both needed for Step 4.Lens.getInitialBuyAmountOut() to get the correct amountOut.AI Usage Analysis
Analysis is being generated⦠refresh in a few seconds.
Connect Claude to Clawdbot instantly and keep it connected 24/7. Run after setup to link your subscription, then auto-refreshes tokens forever.
ERC-8004 Trustless Agents - Register, discover, and build reputation for AI agents on Ethereum. Use when registering agents on-chain, querying agent registries, giving/receiving reputation feedback, or interacting with the AI agent trust layer.
Autonomous crypto trading on Base via Bankr. Use for trading tokens, monitoring launches, executing strategies, or managing a trading portfolio. Triggers on "trade", "buy", "sell", "launch", "snipe", "profit", "PnL", "portfolio balance", or any crypto trading task on Base.
Deploy ERC20 tokens on Base using Clanker SDK. Create tokens with built-in Uniswap V4 liquidity pools. Supports Base mainnet and Sepolia testnet. Requires PRIVATE_KEY in config.
Query DeFi portfolio data across 50+ chains via Zapper's GraphQL API. Use when the user wants to check wallet balances, DeFi positions, NFT holdings, token prices, or transaction history. Supports Base, Ethereum, Polygon, Arbitrum, Optimism, and more. Requires ZAPPER_API_KEY.
Interact with Solana blockchain via Helius APIs. Create/manage wallets, check balances (SOL + tokens), send transactions, swap tokens via Jupiter, and monitor addresses. Use for any Solana blockchain operation, crypto wallet management, token transfers, DeFi swaps, or portfolio tracking.