{"id":"c6b29b33-719d-499d-bd02-2cd4d10f59b2","entityType":"agent","slug":"clawhub-issa-me-sush-openserv-launch","name":"OpenServ Launch","canonicalUrl":"https://www.xpersona.co/agent/clawhub-issa-me-sush-openserv-launch","canonicalPath":"/agent/clawhub-issa-me-sush-openserv-launch","generatedAt":"2026-10-10T17:35:18.322Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":null},"description":"Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d... Skill: OpenServ Launch Owner: issa-me-sush Summary: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-02-16T20:59:26.927Z | user - Added example environment file: examples/env.example - No changes to documentation or core functionality. - This update provides","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.4K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s1723fny14hmpvya23s46azmxx88526w:openserv-launch","sourceUrl":"https://clawhub.ai/issa-me-sush/openserv-launch","homepage":"https://clawhub.ai/issa-me-sush/skills/openserv-launch","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/issa-me-sush/openserv-launch","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/issa-me-sush/skills/openserv-launch","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":null},"stars":null,"forks":null,"downloads":1389,"packageName":null,"latestVersion":"1.0.3","tractionLabel":"1.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T14:23:49.279Z","lastCrawledAt":"2026-10-10T14:23:49.279Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T14:23:49.279Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.3","createdAt":"2026-02-16T20:59:26.927Z","changelog":"- Added example environment file: examples/env.example - No changes to documentation or core functionality. - This update provides a template for environment configuration.","fileCount":8,"zipByteSize":14532},{"version":"1.0.2","createdAt":"2026-02-16T19:03:55.438Z","changelog":"fixes","fileCount":7,"zipByteSize":14213},{"version":"1.0.1","createdAt":"2026-02-10T23:20:28.268Z","changelog":"fixes","fileCount":7,"zipByteSize":14222},{"version":"1.0.0","createdAt":"2026-02-09T11:47:43.376Z","changelog":"Initial release of openserv-launch - Instantly launch ERC-20 tokens on Base mainnet via the OpenServ Launch API. - Creates Aerodrome concentrated liquidity pools with one-sided, 2,000,000x price range. - Automatically locks LP for 1 year; splits all pool fees 50/50 with the creator. - Includes full API reference, troubleshooting guide, and example integrations. - Enforces 1 launch per wallet per 24h and requires wallet activity for anti-spam. - Provides ready-to-use agent/automation example with code.","fileCount":8,"zipByteSize":14504}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1723fny14hmpvya23s46azmxx88526w:openserv-launch","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T17:35:18.321Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-issa-me-sush-openserv-launch/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":null},"readme":"Skill: OpenServ Launch\n\nOwner: issa-me-sush\n\nSummary: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d...\n\nTags: latest:1.0.3\n\nVersion history:\n\nv1.0.3 | 2026-02-16T20:59:26.927Z | user\n\n- Added example environment file: examples/env.example  \n- No changes to documentation or core functionality.  \n- This update provides a template for environment configuration.\n\nv1.0.2 | 2026-02-16T19:03:55.438Z | user\n\nfixes\n\nv1.0.1 | 2026-02-10T23:20:28.268Z | user\n\nfixes\n\nv1.0.0 | 2026-02-09T11:47:43.376Z | auto\n\nInitial release of openserv-launch\n\n- Instantly launch ERC-20 tokens on Base mainnet via the OpenServ Launch API.\n- Creates Aerodrome concentrated liquidity pools with one-sided, 2,000,000x price range.\n- Automatically locks LP for 1 year; splits all pool fees 50/50 with the creator.\n- Includes full API reference, troubleshooting guide, and example integrations.\n- Enforces 1 launch per wallet per 24h and requires wallet activity for anti-spam.\n- Provides ready-to-use agent/automation example with code.\n\nArchive index:\n\nArchive v1.0.3: 8 files, 14532 bytes\n\nFiles: examples/agent-launcher.ts (6518b), examples/env.example.txt (217b), examples/launch-token.ts (4164b), examples/list-tokens.ts (3322b), reference.md (10269b), SKILL.md (7653b), troubleshooting.md (5095b), _meta.json (134b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: openserv-launch\ndescription: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, deploying memecoins, or building agents that create tokens with locked LP. Read reference.md for the full API reference. Read openserv-agent-sdk and openserv-client for building and running agents. You can launch tokens for your OpenServ agents.\n---\n\n# OpenServ Launch API\n\nLaunch tokens instantly on Base blockchain with one-sided concentrated liquidity pools on Aerodrome Slipstream.\n\n**Reference files:**\n\n- `reference.md` - Full API reference for all endpoints\n- `troubleshooting.md` - Common issues and solutions\n- `examples/` - Complete code examples\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\n---\n\n## What This API Does\n\n- **Deploys ERC-20 tokens** - 1 billion supply, standard token contract\n- **Creates Aerodrome CL pools** - One-sided liquidity with 2,000,000x price range\n- **Locks LP for 1 year** - Automatic rug-pull protection\n- **Splits fees 50/50** - Creator wallet receives 50% of all trading fees\n\n---\n\n## Quick Start\n\n### Dependencies\n\n```bash\nnpm install axios\n```\n\n### Launch a Token\n\n```typescript\nimport axios from 'axios'\n\nconst response = await axios.post('https://instant-launch.openserv.ai/api/launch', {\n  name: 'My Token',\n  symbol: 'MTK',\n  wallet: '0x1234567890abcdef1234567890abcdef12345678',\n  description: 'A cool memecoin',\n  imageUrl: 'https://example.com/logo.png',\n  website: 'https://mytoken.com',\n  twitter: '@mytoken'\n})\n\nconsole.log(response.data)\n// {\n//   success: true,\n//   token: { address: '0x...', name: 'My Token', symbol: 'MTK', supply: '1000000000' },\n//   pool: { address: '0x...', tickSpacing: 500, fee: '2%' },\n//   locker: { address: '0x...', lpTokenId: '12345', lockedUntil: '2027-02-03T...' },\n//   txHashes: { tokenDeploy: '0x...', lpMint: '0x...', lock: '0x...', buy: '0x...' },\n//   links: { explorer: '...', aerodrome: '...', dexscreener: '...' }\n// }\n```\n\n---\n\n## Endpoints Overview\n\n| Endpoint              | Method | Description                      |\n| --------------------- | ------ | -------------------------------- |\n| `/api/launch`         | POST   | Create a new token with LP pool  |\n| `/api/tokens`         | GET    | List launched tokens             |\n| `/api/tokens/:address`| GET    | Get token details by address     |\n\n---\n\n## Launch Request Fields\n\n| Field       | Type   | Required | Description                                      |\n| ----------- | ------ | -------- | ------------------------------------------------ |\n| `name`      | string | Yes      | Token name (1-64 characters)                     |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)   |\n| `description` | string | No     | Token description (max 500 characters)          |\n| `imageUrl`  | string | No       | Direct link to image file (jpg, png, gif, webp, svg) |\n| `website`   | string | No       | Website URL (must start with http/https)        |\n| `twitter`   | string | No       | Twitter handle (with or without @)              |\n\n---\n\n## Launch Response\n\n```typescript\ninterface LaunchResponse {\n  success: true\n  internalId: string           // Database record ID\n  creator: string              // Creator wallet address\n  token: {\n    address: string            // Deployed token contract\n    name: string\n    symbol: string\n    supply: string             // Always \"1000000000\"\n  }\n  pool: {\n    address: string            // Aerodrome CL pool\n    tickSpacing: number        // 500\n    fee: string                // \"2%\"\n  }\n  locker: {\n    address: string            // LP locker contract\n    lpTokenId: string          // NFT position ID\n    lockedUntil: string        // ISO date (1 year from launch)\n  }\n  txHashes: {\n    tokenDeploy: string        // Token deployment tx\n    stakingTransfer: string    // 5% staking allocation tx\n    lpMint: string             // LP position mint tx\n    lock: string               // LP lock tx\n    buy: string                // Initial buy tx\n  }\n  links: {\n    explorer: string           // Basescan token page\n    aerodrome: string          // Aerodrome swap page\n    dexscreener: string        // DEXScreener chart\n    defillama: string          // DefiLlama swap\n  }\n}\n```\n\n---\n\n## Token Defaults\n\n| Setting            | Value              |\n| ------------------ | ------------------ |\n| Token Supply       | 1 billion          |\n| Initial Market Cap | $15,000            |\n| Price Range        | 2,000,000x (~$30B) |\n| Pool Fee           | 2%                 |\n| Tick Spacing       | 500                |\n| Fee Split          | 50/50 (creator/platform) |\n| Lock Duration      | 1 year             |\n| Staking Allocation | 5%                 |\n| Initial Buy        | 0.0005 ETH         |\n\n---\n\n## Example: Agent with Token Launch Capability\n\n```typescript\nimport { Agent, run } from '@openserv-labs/sdk'\nimport { provision, triggers } from '@openserv-labs/client'\nimport { z } from 'zod'\nimport axios from 'axios'\n\nconst agent = new Agent({\n  systemPrompt: 'You help users launch tokens on Base blockchain.'\n})\n\nagent.addCapability({\n  name: 'launch_token',\n  description: 'Launch a new ERC-20 token with LP pool on Aerodrome',\n  schema: z.object({\n    name: z.string().describe('Token name (1-64 chars)'),\n    symbol: z.string().describe('Token symbol (1-10 chars, uppercase)'),\n    wallet: z.string().describe('Creator wallet address'),\n    description: z.string().optional().describe('Token description'),\n    imageUrl: z.string().optional().describe('Logo image URL'),\n    website: z.string().optional().describe('Website URL'),\n    twitter: z.string().optional().describe('Twitter handle')\n  }),\n  async run({ args }) {\n    const response = await axios.post('https://instant-launch.openserv.ai/api/launch', args)\n    const { token, pool, links } = response.data\n    return `Token launched! Address: ${token.address}, Pool: ${pool.address}, Trade: ${links.aerodrome}`\n  }\n})\n\nasync function main() {\n  await provision({\n    agent: {\n      instance: agent,\n      name: 'token-launcher',\n      description: 'Launch tokens on Base with Aerodrome LP'\n    },\n    workflow: {\n      name: 'Token Launcher',\n      goal: 'Launch ERC-20 tokens on Base blockchain with Aerodrome concentrated liquidity pools',\n      trigger: triggers.webhook({ waitForCompletion: true, timeout: 600 })\n    }\n  })\n  await run(agent)\n}\n\nmain().catch(console.error)\n```\n\n---\n\n## Rate Limits\n\n- **1 token per wallet per 24 hours** (spam prevention)\n- Creator wallet must have on-chain activity (not empty)\n\n---\n\n## Network\n\nAll tokens are deployed on **Base Mainnet** (chainId: 8453).\n\n---\n\n## Updating This Skill\n\nThis skill may be outdated. The OpenServ team ships updates regularly—new features, API changes, and bug fixes won't be reflected here until you update. **If something isn't working as expected, or you want to make sure you have the latest information, update the skill before proceeding.**\n\n```bash\n# Check if updates are available\nnpx skills check\n\n# Update all installed skills to latest versions\nnpx skills update\n```\n\nOr reinstall the OpenServ skills directly:\n\n```bash\nnpx skills add openserv-labs/skills\n```\n\n---\n\n## Related Skills\n\n- **openserv-agent-sdk** - Build agents with token launch capabilities\n- **openserv-client** - Provision and deploy agents on the platform\n- **openserv-multi-agent-workflows** - Multi-agent collaboration patterns\n- **openserv-ideaboard-api** - Find ideas and ship token-related services\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn78n8z9y2n0v517vcy9gmy8q180jfmx\",\n  \"slug\": \"openserv-launch\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1771275566927\n}\n\nFile v1.0.3:reference.md\n\n# OpenServ Launch API Reference\n\nComplete API reference for all endpoints.\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\nFor examples, see `examples/` folder.\n\n---\n\n## POST /api/launch\n\nCreate a new token with one-sided LP pool on Aerodrome Slipstream.\n\n**When to use:** Launch a new ERC-20 token with automatic liquidity pool creation and LP locking.\n\n### Request Body\n\n| Field       | Type   | Required | Description                                        |\n| ----------- | ------ | -------- | -------------------------------------------------- |\n| `name`      | string | Yes      | Token name (1-64 characters)                       |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)      |\n| `description` | string | No     | Token description (max 500 characters)             |\n| `imageUrl`  | string | No       | Direct image URL (jpg, jpeg, png, gif, webp, svg, avif, bmp, ico) |\n| `website`   | string | No       | Website URL (must start with http:// or https://)  |\n| `twitter`   | string | No       | Twitter handle (with or without @, max 15 chars)   |\n\n### Example Request\n\n```bash\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"wallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\"\n  }'\n```\n\n### Example Response (201 Created)\n\n```json\n{\n  \"success\": true,\n  \"internalId\": \"65f1a2b3c4d5e6f7g8h9i0j1\",\n  \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"supply\": \"1000000000\"\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"txHashes\": {\n    \"tokenDeploy\": \"0x1111111111111111111111111111111111111111111111111111111111111111\",\n    \"stakingTransfer\": \"0x2222222222222222222222222222222222222222222222222222222222222222\",\n    \"lpMint\": \"0x3333333333333333333333333333333333333333333333333333333333333333\",\n    \"lock\": \"0x4444444444444444444444444444444444444444444444444444444444444444\",\n    \"buy\": \"0x5555555555555555555555555555555555555555555555555555555555555555\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x9876543210fedcba9876543210fedcba98765432\",\n    \"defillama\": \"https://swap.defillama.com/?chain=base&from=0x0000000000000000000000000000000000000000&tab=swap&to=0xabcdef1234567890abcdef1234567890abcdef12\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description                                           |\n| ------ | ----------------------------------------------------- |\n| 400    | Validation error (invalid name, symbol, wallet, etc.) |\n| 400    | Daily launch limit reached (1 per wallet per 24h)     |\n| 400    | Creator wallet has no on-chain activity               |\n| 500    | Transaction failed (insufficient gas, RPC error)      |\n\n---\n\n## GET /api/tokens\n\nList launched tokens with pagination.\n\n**When to use:** Browse all tokens launched via the API, optionally filtered by creator.\n\n### Query Parameters\n\n| Parameter | Type   | Default | Description                         |\n| --------- | ------ | ------- | ----------------------------------- |\n| `limit`   | number | 50      | Items per page (1-100)              |\n| `page`    | number | 1       | Page number (1-based)               |\n| `creator` | string | -       | Filter by creator wallet address    |\n\n### Example Request\n\n```bash\n# List first page of tokens\ncurl \"https://instant-launch.openserv.ai/api/tokens\"\n\n# Filter by creator\ncurl \"https://instant-launch.openserv.ai/api/tokens?creator=0x1234...\"\n\n# Paginate results\ncurl \"https://instant-launch.openserv.ai/api/tokens?limit=10&page=2\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"tokens\": [\n    {\n      \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n      \"name\": \"My Token\",\n      \"symbol\": \"MTK\",\n      \"description\": \"A revolutionary memecoin\",\n      \"imageUrl\": \"https://example.com/logo.png\",\n      \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n      \"pool\": \"0x9876543210fedcba9876543210fedcba98765432\",\n      \"locker\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n      \"initialMarketCapUsd\": 15000,\n      \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n      \"links\": {\n        \"explorer\": \"https://basescan.org/token/0x...\",\n        \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n        \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"limit\": 50,\n    \"page\": 1,\n    \"totalDocs\": 100,\n    \"totalPages\": 2,\n    \"hasPrevPage\": false,\n    \"hasNextPage\": true,\n    \"prevPage\": null,\n    \"nextPage\": 2\n  }\n}\n```\n\n---\n\n## GET /api/tokens/:address\n\nGet detailed information about a specific token by its contract address.\n\n**When to use:** Fetch complete token details including pool configuration, locker info, and transaction hashes.\n\n### Path Parameters\n\n| Parameter | Type   | Required | Description                    |\n| --------- | ------ | -------- | ------------------------------ |\n| `address` | string | Yes      | Token contract address (0x...) |\n\n### Example Request\n\n```bash\ncurl \"https://instant-launch.openserv.ai/api/tokens/0xabcdef1234567890abcdef1234567890abcdef12\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\",\n    \"supply\": \"1000000000\",\n    \"decimals\": 18\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"tickLower\": -887200,\n    \"tickUpper\": 0,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"fees\": {\n    \"creatorWallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"platformWallet\": \"0x...\",\n    \"creatorShare\": \"50%\",\n    \"platformShare\": \"50%\"\n  },\n  \"transactions\": {\n    \"tokenDeploy\": \"0x1111...\",\n    \"lpMint\": \"0x3333...\",\n    \"lock\": \"0x4444...\"\n  },\n  \"meta\": {\n    \"chainId\": 8453,\n    \"initialMarketCapUsd\": 15000,\n    \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n    \"createdAt\": \"2026-02-05T10:30:00.000Z\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0x...\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description       |\n| ------ | ----------------- |\n| 400    | Invalid address   |\n| 404    | Token not found   |\n\n---\n\n## Error Format\n\nAll errors follow this format:\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Detailed error message\"\n}\n```\n\nCommon validation errors include:\n\n- `Token name is required`\n- `Token name must be 64 characters or less`\n- `Token symbol is required`\n- `Token symbol must be 10 characters or less`\n- `Token symbol must contain only letters and numbers`\n- `Invalid Ethereum address format`\n- `Description must be 500 characters or less`\n- `Image URL must be a direct link to an image file`\n- `Website must be a valid URL`\n- `Invalid Twitter handle format`\n- `Daily launch limit reached (1 per day)`\n\n---\n\n## Contract Addresses (Base Mainnet)\n\n| Contract                    | Address                                      |\n| --------------------------- | -------------------------------------------- |\n| CLFactory                   | `0xaDe65c38CD4849aDBA595a4323a8C7DdfE89716a` |\n| NonfungiblePositionManager  | `0xa990c6a764b73bf43cee5bb40339c3322fb9d55f` |\n| CLPoolLauncher              | `0xb9A1094D614c70B94C2CD7b4efc3A6adC6e6F4d3` |\n| CLLockerFactory             | `0x8BF02b8da7a6091Ac1326d6db2ed25214D812219` |\n| Universal Router            | `0x6Df1c91424F79E40E33B1A48F0687B666bE71075` |\n| WETH                        | `0x4200000000000000000000000000000000000006` |\n\n---\n\n## TypeScript Types\n\n```typescript\n// Request body for POST /api/launch\ninterface LaunchRequest {\n  name: string            // 1-64 chars\n  symbol: string          // 1-10 chars, uppercase, alphanumeric\n  wallet: string          // Valid Ethereum address\n  description?: string    // Max 500 chars\n  imageUrl?: string       // Direct image URL\n  website?: string        // http/https URL\n  twitter?: string        // Twitter handle\n}\n\n// Response from POST /api/launch\ninterface LaunchResponse {\n  success: true\n  internalId: string\n  creator: string\n  token: {\n    address: string\n    name: string\n    symbol: string\n    supply: string\n  }\n  pool: {\n    address: string\n    tickSpacing: number\n    fee: string\n  }\n  locker: {\n    address: string\n    lpTokenId: string\n    lockedUntil: string\n  }\n  txHashes: {\n    tokenDeploy: string\n    stakingTransfer: string\n    lpMint: string\n    lock: string\n    buy: string\n  }\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n    defillama: string\n  }\n}\n\n// Token in list response\ninterface TokenListItem {\n  address: string\n  name: string\n  symbol: string\n  description: string\n  imageUrl?: string\n  creator: string\n  pool: string\n  locker: string\n  initialMarketCapUsd: number\n  launchedAt: string\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n  }\n}\n\n// Pagination info\ninterface Pagination {\n  limit: number\n  page: number\n  totalDocs: number\n  totalPages: number\n  hasPrevPage: boolean\n  hasNextPage: boolean\n  prevPage: number | null\n  nextPage: number | null\n}\n```\n\nFile v1.0.3:troubleshooting.md\n\n# OpenServ Launch API Troubleshooting\n\nCommon issues and solutions when launching tokens.\n\n---\n\n## Validation Errors\n\n### \"Token name is required\" or \"Token symbol is required\"\n\n**Problem:** Missing required fields in the request body.\n\n**Solution:**\n\n- Include both `name` and `symbol` in your request\n- Ensure the Content-Type header is set to `application/json`\n- Verify the JSON is valid (no trailing commas, properly quoted strings)\n\n### \"Token symbol must contain only letters and numbers\"\n\n**Problem:** Symbol contains invalid characters.\n\n**Solution:**\n\n- Use only A-Z and 0-9 in the symbol\n- The API will automatically uppercase the symbol\n- No spaces, hyphens, or special characters allowed\n\n### \"Invalid Ethereum address format\"\n\n**Problem:** The `wallet` field is not a valid Ethereum address.\n\n**Solution:**\n\n- Use a full 42-character address starting with `0x`\n- Ensure all characters are valid hexadecimal (0-9, a-f, A-F)\n- Verify the address using viem's `isAddress()`\n\n### \"Image URL must be a direct link to an image file\"\n\n**Problem:** The `imageUrl` doesn't point to an actual image file.\n\n**Solution:**\n\n- Use a direct URL ending with an image extension: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.svg`, `.avif`, `.bmp`, `.ico`\n- Query parameters after the extension are allowed (e.g., `logo.png?v=1`)\n- Don't use URLs to web pages that display images (e.g., Imgur gallery pages)\n\n### \"Invalid Twitter handle format\"\n\n**Problem:** Twitter handle doesn't match expected format.\n\n**Solution:**\n\n- Use 1-15 alphanumeric characters or underscores\n- The `@` prefix is optional (both `@mytoken` and `mytoken` work)\n- No spaces or special characters\n\n---\n\n## Rate Limiting\n\n### \"Daily launch limit reached (1 per day)\"\n\n**Problem:** The creator wallet has already launched a token in the past 24 hours.\n\n**Solution:**\n\n- Wait 24 hours from the previous launch\n- Use a different creator wallet address\n- This limit is per wallet, not per IP or API key\n\n### Creator wallet validation failed\n\n**Problem:** The wallet address doesn't have sufficient on-chain activity.\n\n**Solution:**\n\n- Ensure the wallet has made at least one transaction on Base\n- The wallet should have some ETH balance or transaction history\n- This is a spam prevention measure\n\n---\n\n## Transaction Failures\n\n### \"Transaction failed\" or timeout errors\n\n**Problem:** Blockchain transaction didn't complete successfully.\n\n**Solution:**\n\n1. Check Base network status for congestion\n2. Retry the request (the API is idempotent for failed launches)\n3. Verify the API's deployer wallet has sufficient ETH for gas\n\n### \"Insufficient funds\" error\n\n**Problem:** The API's deployer wallet doesn't have enough ETH.\n\n**Solution:**\n\n- This is a server-side issue; contact the API operator\n- The deployer needs ~0.01 ETH for a typical launch\n\n---\n\n## Response Parsing\n\n### Missing fields in response\n\n**Problem:** Expected fields are missing from the API response.\n\n**Solution:**\n\n- Optional fields (`description`, `imageUrl`, `website`, `twitter`) only appear if provided\n- Check the `success` field first to confirm the launch succeeded\n- On error, look for the `error` field instead of normal response fields\n\n### Invalid JSON response\n\n**Problem:** Response is not valid JSON.\n\n**Solution:**\n\n- Check the response status code (2xx for success, 4xx/5xx for errors)\n- Verify you're hitting the correct endpoint\n- Check for network issues or proxy interference\n\n---\n\n## Common Mistakes\n\n### Missing Content-Type header\n\n**Problem:** Request fails with unexpected errors.\n\n**Solution:**\n\n```bash\n# Always include Content-Type for POST requests\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"...\", ...}'\n```\n\n### Sending form data instead of JSON\n\n**Problem:** API returns validation errors for all fields.\n\n**Solution:**\n\n- Send JSON body, not form data\n- Use `JSON.stringify()` in JavaScript\n- Set `Content-Type: application/json`\n\n### Using testnet addresses\n\n**Problem:** Token launches but isn't visible on Base mainnet.\n\n**Solution:**\n\n- The API only operates on Base Mainnet (chainId: 8453)\n- Use mainnet wallet addresses\n- All links in the response point to mainnet explorers\n\n---\n\n## Debugging Tips\n\n1. **Check the response body** - Error messages are descriptive and include the specific validation issue\n\n2. **Validate locally first** - Test your request data with a JSON validator and address checker before sending\n\n3. **Verify on Basescan** - After a successful launch, use the explorer link to confirm the token exists\n\n4. **Test with minimal data** - Start with just `name`, `symbol`, and `wallet` before adding optional fields\n\n---\n\n## Example Error Responses\n\n### Validation Error (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Validation failed: symbol: Token symbol must be 10 characters or less\"\n}\n```\n\n### Rate Limit (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Daily launch limit reached (1 per day)\"\n}\n```\n\n### Server Error (500)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Transaction failed: insufficient funds for gas\"\n}\n```\n\nFile v1.0.3:examples/env.example.txt\n\n# OpenServ Launch Examples - Environment Variables\n\n# Your wallet address (receives 50% of trading fees)\n# Required for launching tokens\nCREATOR_WALLET=\n\n# Optional: OpenAI API key (for agent example)\nOPENAI_API_KEY=\n\nArchive v1.0.2: 7 files, 14213 bytes\n\nFiles: examples/agent-launcher.ts (6518b), examples/launch-token.ts (4164b), examples/list-tokens.ts (3322b), reference.md (10269b), SKILL.md (7653b), troubleshooting.md (5095b), _meta.json (134b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: openserv-launch\ndescription: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, deploying memecoins, or building agents that create tokens with locked LP. Read reference.md for the full API reference. Read openserv-agent-sdk and openserv-client for building and running agents. You can launch tokens for your OpenServ agents.\n---\n\n# OpenServ Launch API\n\nLaunch tokens instantly on Base blockchain with one-sided concentrated liquidity pools on Aerodrome Slipstream.\n\n**Reference files:**\n\n- `reference.md` - Full API reference for all endpoints\n- `troubleshooting.md` - Common issues and solutions\n- `examples/` - Complete code examples\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\n---\n\n## What This API Does\n\n- **Deploys ERC-20 tokens** - 1 billion supply, standard token contract\n- **Creates Aerodrome CL pools** - One-sided liquidity with 2,000,000x price range\n- **Locks LP for 1 year** - Automatic rug-pull protection\n- **Splits fees 50/50** - Creator wallet receives 50% of all trading fees\n\n---\n\n## Quick Start\n\n### Dependencies\n\n```bash\nnpm install axios\n```\n\n### Launch a Token\n\n```typescript\nimport axios from 'axios'\n\nconst response = await axios.post('https://instant-launch.openserv.ai/api/launch', {\n  name: 'My Token',\n  symbol: 'MTK',\n  wallet: '0x1234567890abcdef1234567890abcdef12345678',\n  description: 'A cool memecoin',\n  imageUrl: 'https://example.com/logo.png',\n  website: 'https://mytoken.com',\n  twitter: '@mytoken'\n})\n\nconsole.log(response.data)\n// {\n//   success: true,\n//   token: { address: '0x...', name: 'My Token', symbol: 'MTK', supply: '1000000000' },\n//   pool: { address: '0x...', tickSpacing: 500, fee: '2%' },\n//   locker: { address: '0x...', lpTokenId: '12345', lockedUntil: '2027-02-03T...' },\n//   txHashes: { tokenDeploy: '0x...', lpMint: '0x...', lock: '0x...', buy: '0x...' },\n//   links: { explorer: '...', aerodrome: '...', dexscreener: '...' }\n// }\n```\n\n---\n\n## Endpoints Overview\n\n| Endpoint              | Method | Description                      |\n| --------------------- | ------ | -------------------------------- |\n| `/api/launch`         | POST   | Create a new token with LP pool  |\n| `/api/tokens`         | GET    | List launched tokens             |\n| `/api/tokens/:address`| GET    | Get token details by address     |\n\n---\n\n## Launch Request Fields\n\n| Field       | Type   | Required | Description                                      |\n| ----------- | ------ | -------- | ------------------------------------------------ |\n| `name`      | string | Yes      | Token name (1-64 characters)                     |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)   |\n| `description` | string | No     | Token description (max 500 characters)          |\n| `imageUrl`  | string | No       | Direct link to image file (jpg, png, gif, webp, svg) |\n| `website`   | string | No       | Website URL (must start with http/https)        |\n| `twitter`   | string | No       | Twitter handle (with or without @)              |\n\n---\n\n## Launch Response\n\n```typescript\ninterface LaunchResponse {\n  success: true\n  internalId: string           // Database record ID\n  creator: string              // Creator wallet address\n  token: {\n    address: string            // Deployed token contract\n    name: string\n    symbol: string\n    supply: string             // Always \"1000000000\"\n  }\n  pool: {\n    address: string            // Aerodrome CL pool\n    tickSpacing: number        // 500\n    fee: string                // \"2%\"\n  }\n  locker: {\n    address: string            // LP locker contract\n    lpTokenId: string          // NFT position ID\n    lockedUntil: string        // ISO date (1 year from launch)\n  }\n  txHashes: {\n    tokenDeploy: string        // Token deployment tx\n    stakingTransfer: string    // 5% staking allocation tx\n    lpMint: string             // LP position mint tx\n    lock: string               // LP lock tx\n    buy: string                // Initial buy tx\n  }\n  links: {\n    explorer: string           // Basescan token page\n    aerodrome: string          // Aerodrome swap page\n    dexscreener: string        // DEXScreener chart\n    defillama: string          // DefiLlama swap\n  }\n}\n```\n\n---\n\n## Token Defaults\n\n| Setting            | Value              |\n| ------------------ | ------------------ |\n| Token Supply       | 1 billion          |\n| Initial Market Cap | $15,000            |\n| Price Range        | 2,000,000x (~$30B) |\n| Pool Fee           | 2%                 |\n| Tick Spacing       | 500                |\n| Fee Split          | 50/50 (creator/platform) |\n| Lock Duration      | 1 year             |\n| Staking Allocation | 5%                 |\n| Initial Buy        | 0.0005 ETH         |\n\n---\n\n## Example: Agent with Token Launch Capability\n\n```typescript\nimport { Agent, run } from '@openserv-labs/sdk'\nimport { provision, triggers } from '@openserv-labs/client'\nimport { z } from 'zod'\nimport axios from 'axios'\n\nconst agent = new Agent({\n  systemPrompt: 'You help users launch tokens on Base blockchain.'\n})\n\nagent.addCapability({\n  name: 'launch_token',\n  description: 'Launch a new ERC-20 token with LP pool on Aerodrome',\n  schema: z.object({\n    name: z.string().describe('Token name (1-64 chars)'),\n    symbol: z.string().describe('Token symbol (1-10 chars, uppercase)'),\n    wallet: z.string().describe('Creator wallet address'),\n    description: z.string().optional().describe('Token description'),\n    imageUrl: z.string().optional().describe('Logo image URL'),\n    website: z.string().optional().describe('Website URL'),\n    twitter: z.string().optional().describe('Twitter handle')\n  }),\n  async run({ args }) {\n    const response = await axios.post('https://instant-launch.openserv.ai/api/launch', args)\n    const { token, pool, links } = response.data\n    return `Token launched! Address: ${token.address}, Pool: ${pool.address}, Trade: ${links.aerodrome}`\n  }\n})\n\nasync function main() {\n  await provision({\n    agent: {\n      instance: agent,\n      name: 'token-launcher',\n      description: 'Launch tokens on Base with Aerodrome LP'\n    },\n    workflow: {\n      name: 'Token Launcher',\n      goal: 'Launch ERC-20 tokens on Base blockchain with Aerodrome concentrated liquidity pools',\n      trigger: triggers.webhook({ waitForCompletion: true, timeout: 600 })\n    }\n  })\n  await run(agent)\n}\n\nmain().catch(console.error)\n```\n\n---\n\n## Rate Limits\n\n- **1 token per wallet per 24 hours** (spam prevention)\n- Creator wallet must have on-chain activity (not empty)\n\n---\n\n## Network\n\nAll tokens are deployed on **Base Mainnet** (chainId: 8453).\n\n---\n\n## Updating This Skill\n\nThis skill may be outdated. The OpenServ team ships updates regularly—new features, API changes, and bug fixes won't be reflected here until you update. **If something isn't working as expected, or you want to make sure you have the latest information, update the skill before proceeding.**\n\n```bash\n# Check if updates are available\nnpx skills check\n\n# Update all installed skills to latest versions\nnpx skills update\n```\n\nOr reinstall the OpenServ skills directly:\n\n```bash\nnpx skills add openserv-labs/skills\n```\n\n---\n\n## Related Skills\n\n- **openserv-agent-sdk** - Build agents with token launch capabilities\n- **openserv-client** - Provision and deploy agents on the platform\n- **openserv-multi-agent-workflows** - Multi-agent collaboration patterns\n- **openserv-ideaboard-api** - Find ideas and ship token-related services\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn78n8z9y2n0v517vcy9gmy8q180jfmx\",\n  \"slug\": \"openserv-launch\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1771268635438\n}\n\nFile v1.0.2:reference.md\n\n# OpenServ Launch API Reference\n\nComplete API reference for all endpoints.\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\nFor examples, see `examples/` folder.\n\n---\n\n## POST /api/launch\n\nCreate a new token with one-sided LP pool on Aerodrome Slipstream.\n\n**When to use:** Launch a new ERC-20 token with automatic liquidity pool creation and LP locking.\n\n### Request Body\n\n| Field       | Type   | Required | Description                                        |\n| ----------- | ------ | -------- | -------------------------------------------------- |\n| `name`      | string | Yes      | Token name (1-64 characters)                       |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)      |\n| `description` | string | No     | Token description (max 500 characters)             |\n| `imageUrl`  | string | No       | Direct image URL (jpg, jpeg, png, gif, webp, svg, avif, bmp, ico) |\n| `website`   | string | No       | Website URL (must start with http:// or https://)  |\n| `twitter`   | string | No       | Twitter handle (with or without @, max 15 chars)   |\n\n### Example Request\n\n```bash\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"wallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\"\n  }'\n```\n\n### Example Response (201 Created)\n\n```json\n{\n  \"success\": true,\n  \"internalId\": \"65f1a2b3c4d5e6f7g8h9i0j1\",\n  \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"supply\": \"1000000000\"\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"txHashes\": {\n    \"tokenDeploy\": \"0x1111111111111111111111111111111111111111111111111111111111111111\",\n    \"stakingTransfer\": \"0x2222222222222222222222222222222222222222222222222222222222222222\",\n    \"lpMint\": \"0x3333333333333333333333333333333333333333333333333333333333333333\",\n    \"lock\": \"0x4444444444444444444444444444444444444444444444444444444444444444\",\n    \"buy\": \"0x5555555555555555555555555555555555555555555555555555555555555555\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x9876543210fedcba9876543210fedcba98765432\",\n    \"defillama\": \"https://swap.defillama.com/?chain=base&from=0x0000000000000000000000000000000000000000&tab=swap&to=0xabcdef1234567890abcdef1234567890abcdef12\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description                                           |\n| ------ | ----------------------------------------------------- |\n| 400    | Validation error (invalid name, symbol, wallet, etc.) |\n| 400    | Daily launch limit reached (1 per wallet per 24h)     |\n| 400    | Creator wallet has no on-chain activity               |\n| 500    | Transaction failed (insufficient gas, RPC error)      |\n\n---\n\n## GET /api/tokens\n\nList launched tokens with pagination.\n\n**When to use:** Browse all tokens launched via the API, optionally filtered by creator.\n\n### Query Parameters\n\n| Parameter | Type   | Default | Description                         |\n| --------- | ------ | ------- | ----------------------------------- |\n| `limit`   | number | 50      | Items per page (1-100)              |\n| `page`    | number | 1       | Page number (1-based)               |\n| `creator` | string | -       | Filter by creator wallet address    |\n\n### Example Request\n\n```bash\n# List first page of tokens\ncurl \"https://instant-launch.openserv.ai/api/tokens\"\n\n# Filter by creator\ncurl \"https://instant-launch.openserv.ai/api/tokens?creator=0x1234...\"\n\n# Paginate results\ncurl \"https://instant-launch.openserv.ai/api/tokens?limit=10&page=2\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"tokens\": [\n    {\n      \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n      \"name\": \"My Token\",\n      \"symbol\": \"MTK\",\n      \"description\": \"A revolutionary memecoin\",\n      \"imageUrl\": \"https://example.com/logo.png\",\n      \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n      \"pool\": \"0x9876543210fedcba9876543210fedcba98765432\",\n      \"locker\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n      \"initialMarketCapUsd\": 15000,\n      \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n      \"links\": {\n        \"explorer\": \"https://basescan.org/token/0x...\",\n        \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n        \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"limit\": 50,\n    \"page\": 1,\n    \"totalDocs\": 100,\n    \"totalPages\": 2,\n    \"hasPrevPage\": false,\n    \"hasNextPage\": true,\n    \"prevPage\": null,\n    \"nextPage\": 2\n  }\n}\n```\n\n---\n\n## GET /api/tokens/:address\n\nGet detailed information about a specific token by its contract address.\n\n**When to use:** Fetch complete token details including pool configuration, locker info, and transaction hashes.\n\n### Path Parameters\n\n| Parameter | Type   | Required | Description                    |\n| --------- | ------ | -------- | ------------------------------ |\n| `address` | string | Yes      | Token contract address (0x...) |\n\n### Example Request\n\n```bash\ncurl \"https://instant-launch.openserv.ai/api/tokens/0xabcdef1234567890abcdef1234567890abcdef12\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\",\n    \"supply\": \"1000000000\",\n    \"decimals\": 18\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"tickLower\": -887200,\n    \"tickUpper\": 0,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"fees\": {\n    \"creatorWallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"platformWallet\": \"0x...\",\n    \"creatorShare\": \"50%\",\n    \"platformShare\": \"50%\"\n  },\n  \"transactions\": {\n    \"tokenDeploy\": \"0x1111...\",\n    \"lpMint\": \"0x3333...\",\n    \"lock\": \"0x4444...\"\n  },\n  \"meta\": {\n    \"chainId\": 8453,\n    \"initialMarketCapUsd\": 15000,\n    \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n    \"createdAt\": \"2026-02-05T10:30:00.000Z\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0x...\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description       |\n| ------ | ----------------- |\n| 400    | Invalid address   |\n| 404    | Token not found   |\n\n---\n\n## Error Format\n\nAll errors follow this format:\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Detailed error message\"\n}\n```\n\nCommon validation errors include:\n\n- `Token name is required`\n- `Token name must be 64 characters or less`\n- `Token symbol is required`\n- `Token symbol must be 10 characters or less`\n- `Token symbol must contain only letters and numbers`\n- `Invalid Ethereum address format`\n- `Description must be 500 characters or less`\n- `Image URL must be a direct link to an image file`\n- `Website must be a valid URL`\n- `Invalid Twitter handle format`\n- `Daily launch limit reached (1 per day)`\n\n---\n\n## Contract Addresses (Base Mainnet)\n\n| Contract                    | Address                                      |\n| --------------------------- | -------------------------------------------- |\n| CLFactory                   | `0xaDe65c38CD4849aDBA595a4323a8C7DdfE89716a` |\n| NonfungiblePositionManager  | `0xa990c6a764b73bf43cee5bb40339c3322fb9d55f` |\n| CLPoolLauncher              | `0xb9A1094D614c70B94C2CD7b4efc3A6adC6e6F4d3` |\n| CLLockerFactory             | `0x8BF02b8da7a6091Ac1326d6db2ed25214D812219` |\n| Universal Router            | `0x6Df1c91424F79E40E33B1A48F0687B666bE71075` |\n| WETH                        | `0x4200000000000000000000000000000000000006` |\n\n---\n\n## TypeScript Types\n\n```typescript\n// Request body for POST /api/launch\ninterface LaunchRequest {\n  name: string            // 1-64 chars\n  symbol: string          // 1-10 chars, uppercase, alphanumeric\n  wallet: string          // Valid Ethereum address\n  description?: string    // Max 500 chars\n  imageUrl?: string       // Direct image URL\n  website?: string        // http/https URL\n  twitter?: string        // Twitter handle\n}\n\n// Response from POST /api/launch\ninterface LaunchResponse {\n  success: true\n  internalId: string\n  creator: string\n  token: {\n    address: string\n    name: string\n    symbol: string\n    supply: string\n  }\n  pool: {\n    address: string\n    tickSpacing: number\n    fee: string\n  }\n  locker: {\n    address: string\n    lpTokenId: string\n    lockedUntil: string\n  }\n  txHashes: {\n    tokenDeploy: string\n    stakingTransfer: string\n    lpMint: string\n    lock: string\n    buy: string\n  }\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n    defillama: string\n  }\n}\n\n// Token in list response\ninterface TokenListItem {\n  address: string\n  name: string\n  symbol: string\n  description: string\n  imageUrl?: string\n  creator: string\n  pool: string\n  locker: string\n  initialMarketCapUsd: number\n  launchedAt: string\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n  }\n}\n\n// Pagination info\ninterface Pagination {\n  limit: number\n  page: number\n  totalDocs: number\n  totalPages: number\n  hasPrevPage: boolean\n  hasNextPage: boolean\n  prevPage: number | null\n  nextPage: number | null\n}\n```\n\nFile v1.0.2:troubleshooting.md\n\n# OpenServ Launch API Troubleshooting\n\nCommon issues and solutions when launching tokens.\n\n---\n\n## Validation Errors\n\n### \"Token name is required\" or \"Token symbol is required\"\n\n**Problem:** Missing required fields in the request body.\n\n**Solution:**\n\n- Include both `name` and `symbol` in your request\n- Ensure the Content-Type header is set to `application/json`\n- Verify the JSON is valid (no trailing commas, properly quoted strings)\n\n### \"Token symbol must contain only letters and numbers\"\n\n**Problem:** Symbol contains invalid characters.\n\n**Solution:**\n\n- Use only A-Z and 0-9 in the symbol\n- The API will automatically uppercase the symbol\n- No spaces, hyphens, or special characters allowed\n\n### \"Invalid Ethereum address format\"\n\n**Problem:** The `wallet` field is not a valid Ethereum address.\n\n**Solution:**\n\n- Use a full 42-character address starting with `0x`\n- Ensure all characters are valid hexadecimal (0-9, a-f, A-F)\n- Verify the address using viem's `isAddress()`\n\n### \"Image URL must be a direct link to an image file\"\n\n**Problem:** The `imageUrl` doesn't point to an actual image file.\n\n**Solution:**\n\n- Use a direct URL ending with an image extension: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.svg`, `.avif`, `.bmp`, `.ico`\n- Query parameters after the extension are allowed (e.g., `logo.png?v=1`)\n- Don't use URLs to web pages that display images (e.g., Imgur gallery pages)\n\n### \"Invalid Twitter handle format\"\n\n**Problem:** Twitter handle doesn't match expected format.\n\n**Solution:**\n\n- Use 1-15 alphanumeric characters or underscores\n- The `@` prefix is optional (both `@mytoken` and `mytoken` work)\n- No spaces or special characters\n\n---\n\n## Rate Limiting\n\n### \"Daily launch limit reached (1 per day)\"\n\n**Problem:** The creator wallet has already launched a token in the past 24 hours.\n\n**Solution:**\n\n- Wait 24 hours from the previous launch\n- Use a different creator wallet address\n- This limit is per wallet, not per IP or API key\n\n### Creator wallet validation failed\n\n**Problem:** The wallet address doesn't have sufficient on-chain activity.\n\n**Solution:**\n\n- Ensure the wallet has made at least one transaction on Base\n- The wallet should have some ETH balance or transaction history\n- This is a spam prevention measure\n\n---\n\n## Transaction Failures\n\n### \"Transaction failed\" or timeout errors\n\n**Problem:** Blockchain transaction didn't complete successfully.\n\n**Solution:**\n\n1. Check Base network status for congestion\n2. Retry the request (the API is idempotent for failed launches)\n3. Verify the API's deployer wallet has sufficient ETH for gas\n\n### \"Insufficient funds\" error\n\n**Problem:** The API's deployer wallet doesn't have enough ETH.\n\n**Solution:**\n\n- This is a server-side issue; contact the API operator\n- The deployer needs ~0.01 ETH for a typical launch\n\n---\n\n## Response Parsing\n\n### Missing fields in response\n\n**Problem:** Expected fields are missing from the API response.\n\n**Solution:**\n\n- Optional fields (`description`, `imageUrl`, `website`, `twitter`) only appear if provided\n- Check the `success` field first to confirm the launch succeeded\n- On error, look for the `error` field instead of normal response fields\n\n### Invalid JSON response\n\n**Problem:** Response is not valid JSON.\n\n**Solution:**\n\n- Check the response status code (2xx for success, 4xx/5xx for errors)\n- Verify you're hitting the correct endpoint\n- Check for network issues or proxy interference\n\n---\n\n## Common Mistakes\n\n### Missing Content-Type header\n\n**Problem:** Request fails with unexpected errors.\n\n**Solution:**\n\n```bash\n# Always include Content-Type for POST requests\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"...\", ...}'\n```\n\n### Sending form data instead of JSON\n\n**Problem:** API returns validation errors for all fields.\n\n**Solution:**\n\n- Send JSON body, not form data\n- Use `JSON.stringify()` in JavaScript\n- Set `Content-Type: application/json`\n\n### Using testnet addresses\n\n**Problem:** Token launches but isn't visible on Base mainnet.\n\n**Solution:**\n\n- The API only operates on Base Mainnet (chainId: 8453)\n- Use mainnet wallet addresses\n- All links in the response point to mainnet explorers\n\n---\n\n## Debugging Tips\n\n1. **Check the response body** - Error messages are descriptive and include the specific validation issue\n\n2. **Validate locally first** - Test your request data with a JSON validator and address checker before sending\n\n3. **Verify on Basescan** - After a successful launch, use the explorer link to confirm the token exists\n\n4. **Test with minimal data** - Start with just `name`, `symbol`, and `wallet` before adding optional fields\n\n---\n\n## Example Error Responses\n\n### Validation Error (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Validation failed: symbol: Token symbol must be 10 characters or less\"\n}\n```\n\n### Rate Limit (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Daily launch limit reached (1 per day)\"\n}\n```\n\n### Server Error (500)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Transaction failed: insufficient funds for gas\"\n}\n```\n\nArchive v1.0.1: 7 files, 14222 bytes\n\nFiles: examples/agent-launcher.ts (6518b), examples/launch-token.ts (4164b), examples/list-tokens.ts (3322b), reference.md (10269b), SKILL.md (7653b), troubleshooting.md (5120b), _meta.json (134b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: openserv-launch\ndescription: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, deploying memecoins, or building agents that create tokens with locked LP. Read reference.md for the full API reference. Read openserv-agent-sdk and openserv-client for building and running agents. You can launch tokens for your OpenServ agents.\n---\n\n# OpenServ Launch API\n\nLaunch tokens instantly on Base blockchain with one-sided concentrated liquidity pools on Aerodrome Slipstream.\n\n**Reference files:**\n\n- `reference.md` - Full API reference for all endpoints\n- `troubleshooting.md` - Common issues and solutions\n- `examples/` - Complete code examples\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\n---\n\n## What This API Does\n\n- **Deploys ERC-20 tokens** - 1 billion supply, standard token contract\n- **Creates Aerodrome CL pools** - One-sided liquidity with 2,000,000x price range\n- **Locks LP for 1 year** - Automatic rug-pull protection\n- **Splits fees 50/50** - Creator wallet receives 50% of all trading fees\n\n---\n\n## Quick Start\n\n### Dependencies\n\n```bash\nnpm install axios\n```\n\n### Launch a Token\n\n```typescript\nimport axios from 'axios'\n\nconst response = await axios.post('https://instant-launch.openserv.ai/api/launch', {\n  name: 'My Token',\n  symbol: 'MTK',\n  wallet: '0x1234567890abcdef1234567890abcdef12345678',\n  description: 'A cool memecoin',\n  imageUrl: 'https://example.com/logo.png',\n  website: 'https://mytoken.com',\n  twitter: '@mytoken'\n})\n\nconsole.log(response.data)\n// {\n//   success: true,\n//   token: { address: '0x...', name: 'My Token', symbol: 'MTK', supply: '1000000000' },\n//   pool: { address: '0x...', tickSpacing: 500, fee: '2%' },\n//   locker: { address: '0x...', lpTokenId: '12345', lockedUntil: '2027-02-03T...' },\n//   txHashes: { tokenDeploy: '0x...', lpMint: '0x...', lock: '0x...', buy: '0x...' },\n//   links: { explorer: '...', aerodrome: '...', dexscreener: '...' }\n// }\n```\n\n---\n\n## Endpoints Overview\n\n| Endpoint              | Method | Description                      |\n| --------------------- | ------ | -------------------------------- |\n| `/api/launch`         | POST   | Create a new token with LP pool  |\n| `/api/tokens`         | GET    | List launched tokens             |\n| `/api/tokens/:address`| GET    | Get token details by address     |\n\n---\n\n## Launch Request Fields\n\n| Field       | Type   | Required | Description                                      |\n| ----------- | ------ | -------- | ------------------------------------------------ |\n| `name`      | string | Yes      | Token name (1-64 characters)                     |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)   |\n| `description` | string | No     | Token description (max 500 characters)          |\n| `imageUrl`  | string | No       | Direct link to image file (jpg, png, gif, webp, svg) |\n| `website`   | string | No       | Website URL (must start with http/https)        |\n| `twitter`   | string | No       | Twitter handle (with or without @)              |\n\n---\n\n## Launch Response\n\n```typescript\ninterface LaunchResponse {\n  success: true\n  internalId: string           // Database record ID\n  creator: string              // Creator wallet address\n  token: {\n    address: string            // Deployed token contract\n    name: string\n    symbol: string\n    supply: string             // Always \"1000000000\"\n  }\n  pool: {\n    address: string            // Aerodrome CL pool\n    tickSpacing: number        // 500\n    fee: string                // \"2%\"\n  }\n  locker: {\n    address: string            // LP locker contract\n    lpTokenId: string          // NFT position ID\n    lockedUntil: string        // ISO date (1 year from launch)\n  }\n  txHashes: {\n    tokenDeploy: string        // Token deployment tx\n    stakingTransfer: string    // 5% staking allocation tx\n    lpMint: string             // LP position mint tx\n    lock: string               // LP lock tx\n    buy: string                // Initial buy tx\n  }\n  links: {\n    explorer: string           // Basescan token page\n    aerodrome: string          // Aerodrome swap page\n    dexscreener: string        // DEXScreener chart\n    defillama: string          // DefiLlama swap\n  }\n}\n```\n\n---\n\n## Token Defaults\n\n| Setting            | Value              |\n| ------------------ | ------------------ |\n| Token Supply       | 1 billion          |\n| Initial Market Cap | $15,000            |\n| Price Range        | 2,000,000x (~$30B) |\n| Pool Fee           | 2%                 |\n| Tick Spacing       | 500                |\n| Fee Split          | 50/50 (creator/platform) |\n| Lock Duration      | 1 year             |\n| Staking Allocation | 5%                 |\n| Initial Buy        | 0.0005 ETH         |\n\n---\n\n## Example: Agent with Token Launch Capability\n\n```typescript\nimport { Agent, run } from '@openserv-labs/sdk'\nimport { provision, triggers } from '@openserv-labs/client'\nimport { z } from 'zod'\nimport axios from 'axios'\n\nconst agent = new Agent({\n  systemPrompt: 'You help users launch tokens on Base blockchain.'\n})\n\nagent.addCapability({\n  name: 'launch_token',\n  description: 'Launch a new ERC-20 token with LP pool on Aerodrome',\n  schema: z.object({\n    name: z.string().describe('Token name (1-64 chars)'),\n    symbol: z.string().describe('Token symbol (1-10 chars, uppercase)'),\n    wallet: z.string().describe('Creator wallet address'),\n    description: z.string().optional().describe('Token description'),\n    imageUrl: z.string().optional().describe('Logo image URL'),\n    website: z.string().optional().describe('Website URL'),\n    twitter: z.string().optional().describe('Twitter handle')\n  }),\n  async run({ args }) {\n    const response = await axios.post('https://instant-launch.openserv.ai/api/launch', args)\n    const { token, pool, links } = response.data\n    return `Token launched! Address: ${token.address}, Pool: ${pool.address}, Trade: ${links.aerodrome}`\n  }\n})\n\nasync function main() {\n  await provision({\n    agent: {\n      instance: agent,\n      name: 'token-launcher',\n      description: 'Launch tokens on Base with Aerodrome LP'\n    },\n    workflow: {\n      name: 'Token Launcher',\n      goal: 'Launch ERC-20 tokens on Base blockchain with Aerodrome concentrated liquidity pools',\n      trigger: triggers.webhook({ waitForCompletion: true, timeout: 600 })\n    }\n  })\n  await run(agent)\n}\n\nmain().catch(console.error)\n```\n\n---\n\n## Rate Limits\n\n- **1 token per wallet per 24 hours** (spam prevention)\n- Creator wallet must have on-chain activity (not empty)\n\n---\n\n## Network\n\nAll tokens are deployed on **Base Mainnet** (chainId: 8453).\n\n---\n\n## Updating This Skill\n\nThis skill may be outdated. The OpenServ team ships updates regularly—new features, API changes, and bug fixes won't be reflected here until you update. **If something isn't working as expected, or you want to make sure you have the latest information, update the skill before proceeding.**\n\n```bash\n# Check if updates are available\nnpx skills check\n\n# Update all installed skills to latest versions\nnpx skills update\n```\n\nOr reinstall the OpenServ skills directly:\n\n```bash\nnpx skills add openserv-labs/skills\n```\n\n---\n\n## Related Skills\n\n- **openserv-agent-sdk** - Build agents with token launch capabilities\n- **openserv-client** - Provision and deploy agents on the platform\n- **openserv-multi-agent-workflows** - Multi-agent collaboration patterns\n- **openserv-ideaboard-api** - Find ideas and ship token-related services\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn78n8z9y2n0v517vcy9gmy8q180jfmx\",\n  \"slug\": \"openserv-launch\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1770765628268\n}\n\nFile v1.0.1:reference.md\n\n# OpenServ Launch API Reference\n\nComplete API reference for all endpoints.\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\nFor examples, see `examples/` folder.\n\n---\n\n## POST /api/launch\n\nCreate a new token with one-sided LP pool on Aerodrome Slipstream.\n\n**When to use:** Launch a new ERC-20 token with automatic liquidity pool creation and LP locking.\n\n### Request Body\n\n| Field       | Type   | Required | Description                                        |\n| ----------- | ------ | -------- | -------------------------------------------------- |\n| `name`      | string | Yes      | Token name (1-64 characters)                       |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)      |\n| `description` | string | No     | Token description (max 500 characters)             |\n| `imageUrl`  | string | No       | Direct image URL (jpg, jpeg, png, gif, webp, svg, avif, bmp, ico) |\n| `website`   | string | No       | Website URL (must start with http:// or https://)  |\n| `twitter`   | string | No       | Twitter handle (with or without @, max 15 chars)   |\n\n### Example Request\n\n```bash\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"wallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\"\n  }'\n```\n\n### Example Response (201 Created)\n\n```json\n{\n  \"success\": true,\n  \"internalId\": \"65f1a2b3c4d5e6f7g8h9i0j1\",\n  \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"supply\": \"1000000000\"\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"txHashes\": {\n    \"tokenDeploy\": \"0x1111111111111111111111111111111111111111111111111111111111111111\",\n    \"stakingTransfer\": \"0x2222222222222222222222222222222222222222222222222222222222222222\",\n    \"lpMint\": \"0x3333333333333333333333333333333333333333333333333333333333333333\",\n    \"lock\": \"0x4444444444444444444444444444444444444444444444444444444444444444\",\n    \"buy\": \"0x5555555555555555555555555555555555555555555555555555555555555555\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x9876543210fedcba9876543210fedcba98765432\",\n    \"defillama\": \"https://swap.defillama.com/?chain=base&from=0x0000000000000000000000000000000000000000&tab=swap&to=0xabcdef1234567890abcdef1234567890abcdef12\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description                                           |\n| ------ | ----------------------------------------------------- |\n| 400    | Validation error (invalid name, symbol, wallet, etc.) |\n| 400    | Daily launch limit reached (1 per wallet per 24h)     |\n| 400    | Creator wallet has no on-chain activity               |\n| 500    | Transaction failed (insufficient gas, RPC error)      |\n\n---\n\n## GET /api/tokens\n\nList launched tokens with pagination.\n\n**When to use:** Browse all tokens launched via the API, optionally filtered by creator.\n\n### Query Parameters\n\n| Parameter | Type   | Default | Description                         |\n| --------- | ------ | ------- | ----------------------------------- |\n| `limit`   | number | 50      | Items per page (1-100)              |\n| `page`    | number | 1       | Page number (1-based)               |\n| `creator` | string | -       | Filter by creator wallet address    |\n\n### Example Request\n\n```bash\n# List first page of tokens\ncurl \"https://instant-launch.openserv.ai/api/tokens\"\n\n# Filter by creator\ncurl \"https://instant-launch.openserv.ai/api/tokens?creator=0x1234...\"\n\n# Paginate results\ncurl \"https://instant-launch.openserv.ai/api/tokens?limit=10&page=2\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"tokens\": [\n    {\n      \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n      \"name\": \"My Token\",\n      \"symbol\": \"MTK\",\n      \"description\": \"A revolutionary memecoin\",\n      \"imageUrl\": \"https://example.com/logo.png\",\n      \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n      \"pool\": \"0x9876543210fedcba9876543210fedcba98765432\",\n      \"locker\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n      \"initialMarketCapUsd\": 15000,\n      \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n      \"links\": {\n        \"explorer\": \"https://basescan.org/token/0x...\",\n        \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n        \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"limit\": 50,\n    \"page\": 1,\n    \"totalDocs\": 100,\n    \"totalPages\": 2,\n    \"hasPrevPage\": false,\n    \"hasNextPage\": true,\n    \"prevPage\": null,\n    \"nextPage\": 2\n  }\n}\n```\n\n---\n\n## GET /api/tokens/:address\n\nGet detailed information about a specific token by its contract address.\n\n**When to use:** Fetch complete token details including pool configuration, locker info, and transaction hashes.\n\n### Path Parameters\n\n| Parameter | Type   | Required | Description                    |\n| --------- | ------ | -------- | ------------------------------ |\n| `address` | string | Yes      | Token contract address (0x...) |\n\n### Example Request\n\n```bash\ncurl \"https://instant-launch.openserv.ai/api/tokens/0xabcdef1234567890abcdef1234567890abcdef12\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\",\n    \"supply\": \"1000000000\",\n    \"decimals\": 18\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"tickLower\": -887200,\n    \"tickUpper\": 0,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"fees\": {\n    \"creatorWallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"platformWallet\": \"0x...\",\n    \"creatorShare\": \"50%\",\n    \"platformShare\": \"50%\"\n  },\n  \"transactions\": {\n    \"tokenDeploy\": \"0x1111...\",\n    \"lpMint\": \"0x3333...\",\n    \"lock\": \"0x4444...\"\n  },\n  \"meta\": {\n    \"chainId\": 8453,\n    \"initialMarketCapUsd\": 15000,\n    \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n    \"createdAt\": \"2026-02-05T10:30:00.000Z\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0x...\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description       |\n| ------ | ----------------- |\n| 400    | Invalid address   |\n| 404    | Token not found   |\n\n---\n\n## Error Format\n\nAll errors follow this format:\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Detailed error message\"\n}\n```\n\nCommon validation errors include:\n\n- `Token name is required`\n- `Token name must be 64 characters or less`\n- `Token symbol is required`\n- `Token symbol must be 10 characters or less`\n- `Token symbol must contain only letters and numbers`\n- `Invalid Ethereum address format`\n- `Description must be 500 characters or less`\n- `Image URL must be a direct link to an image file`\n- `Website must be a valid URL`\n- `Invalid Twitter handle format`\n- `Daily launch limit reached (1 per day)`\n\n---\n\n## Contract Addresses (Base Mainnet)\n\n| Contract                    | Address                                      |\n| --------------------------- | -------------------------------------------- |\n| CLFactory                   | `0xaDe65c38CD4849aDBA595a4323a8C7DdfE89716a` |\n| NonfungiblePositionManager  | `0xa990c6a764b73bf43cee5bb40339c3322fb9d55f` |\n| CLPoolLauncher              | `0xb9A1094D614c70B94C2CD7b4efc3A6adC6e6F4d3` |\n| CLLockerFactory             | `0x8BF02b8da7a6091Ac1326d6db2ed25214D812219` |\n| Universal Router            | `0x6Df1c91424F79E40E33B1A48F0687B666bE71075` |\n| WETH                        | `0x4200000000000000000000000000000000000006` |\n\n---\n\n## TypeScript Types\n\n```typescript\n// Request body for POST /api/launch\ninterface LaunchRequest {\n  name: string            // 1-64 chars\n  symbol: string          // 1-10 chars, uppercase, alphanumeric\n  wallet: string          // Valid Ethereum address\n  description?: string    // Max 500 chars\n  imageUrl?: string       // Direct image URL\n  website?: string        // http/https URL\n  twitter?: string        // Twitter handle\n}\n\n// Response from POST /api/launch\ninterface LaunchResponse {\n  success: true\n  internalId: string\n  creator: string\n  token: {\n    address: string\n    name: string\n    symbol: string\n    supply: string\n  }\n  pool: {\n    address: string\n    tickSpacing: number\n    fee: string\n  }\n  locker: {\n    address: string\n    lpTokenId: string\n    lockedUntil: string\n  }\n  txHashes: {\n    tokenDeploy: string\n    stakingTransfer: string\n    lpMint: string\n    lock: string\n    buy: string\n  }\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n    defillama: string\n  }\n}\n\n// Token in list response\ninterface TokenListItem {\n  address: string\n  name: string\n  symbol: string\n  description: string\n  imageUrl?: string\n  creator: string\n  pool: string\n  locker: string\n  initialMarketCapUsd: number\n  launchedAt: string\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n  }\n}\n\n// Pagination info\ninterface Pagination {\n  limit: number\n  page: number\n  totalDocs: number\n  totalPages: number\n  hasPrevPage: boolean\n  hasNextPage: boolean\n  prevPage: number | null\n  nextPage: number | null\n}\n```\n\nFile v1.0.1:troubleshooting.md\n\n# OpenServ Launch API Troubleshooting\n\nCommon issues and solutions when launching tokens.\n\n---\n\n## Validation Errors\n\n### \"Token name is required\" or \"Token symbol is required\"\n\n**Problem:** Missing required fields in the request body.\n\n**Solution:**\n\n- Include both `name` and `symbol` in your request\n- Ensure the Content-Type header is set to `application/json`\n- Verify the JSON is valid (no trailing commas, properly quoted strings)\n\n### \"Token symbol must contain only letters and numbers\"\n\n**Problem:** Symbol contains invalid characters.\n\n**Solution:**\n\n- Use only A-Z and 0-9 in the symbol\n- The API will automatically uppercase the symbol\n- No spaces, hyphens, or special characters allowed\n\n### \"Invalid Ethereum address format\"\n\n**Problem:** The `wallet` field is not a valid Ethereum address.\n\n**Solution:**\n\n- Use a full 42-character address starting with `0x`\n- Ensure all characters are valid hexadecimal (0-9, a-f, A-F)\n- Verify the address using viem's `isAddress()` or ethers' `isAddress()`\n\n### \"Image URL must be a direct link to an image file\"\n\n**Problem:** The `imageUrl` doesn't point to an actual image file.\n\n**Solution:**\n\n- Use a direct URL ending with an image extension: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.svg`, `.avif`, `.bmp`, `.ico`\n- Query parameters after the extension are allowed (e.g., `logo.png?v=1`)\n- Don't use URLs to web pages that display images (e.g., Imgur gallery pages)\n\n### \"Invalid Twitter handle format\"\n\n**Problem:** Twitter handle doesn't match expected format.\n\n**Solution:**\n\n- Use 1-15 alphanumeric characters or underscores\n- The `@` prefix is optional (both `@mytoken` and `mytoken` work)\n- No spaces or special characters\n\n---\n\n## Rate Limiting\n\n### \"Daily launch limit reached (1 per day)\"\n\n**Problem:** The creator wallet has already launched a token in the past 24 hours.\n\n**Solution:**\n\n- Wait 24 hours from the previous launch\n- Use a different creator wallet address\n- This limit is per wallet, not per IP or API key\n\n### Creator wallet validation failed\n\n**Problem:** The wallet address doesn't have sufficient on-chain activity.\n\n**Solution:**\n\n- Ensure the wallet has made at least one transaction on Base\n- The wallet should have some ETH balance or transaction history\n- This is a spam prevention measure\n\n---\n\n## Transaction Failures\n\n### \"Transaction failed\" or timeout errors\n\n**Problem:** Blockchain transaction didn't complete successfully.\n\n**Solution:**\n\n1. Check Base network status for congestion\n2. Retry the request (the API is idempotent for failed launches)\n3. Verify the API's deployer wallet has sufficient ETH for gas\n\n### \"Insufficient funds\" error\n\n**Problem:** The API's deployer wallet doesn't have enough ETH.\n\n**Solution:**\n\n- This is a server-side issue; contact the API operator\n- The deployer needs ~0.01 ETH for a typical launch\n\n---\n\n## Response Parsing\n\n### Missing fields in response\n\n**Problem:** Expected fields are missing from the API response.\n\n**Solution:**\n\n- Optional fields (`description`, `imageUrl`, `website`, `twitter`) only appear if provided\n- Check the `success` field first to confirm the launch succeeded\n- On error, look for the `error` field instead of normal response fields\n\n### Invalid JSON response\n\n**Problem:** Response is not valid JSON.\n\n**Solution:**\n\n- Check the response status code (2xx for success, 4xx/5xx for errors)\n- Verify you're hitting the correct endpoint\n- Check for network issues or proxy interference\n\n---\n\n## Common Mistakes\n\n### Missing Content-Type header\n\n**Problem:** Request fails with unexpected errors.\n\n**Solution:**\n\n```bash\n# Always include Content-Type for POST requests\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"...\", ...}'\n```\n\n### Sending form data instead of JSON\n\n**Problem:** API returns validation errors for all fields.\n\n**Solution:**\n\n- Send JSON body, not form data\n- Use `JSON.stringify()` in JavaScript\n- Set `Content-Type: application/json`\n\n### Using testnet addresses\n\n**Problem:** Token launches but isn't visible on Base mainnet.\n\n**Solution:**\n\n- The API only operates on Base Mainnet (chainId: 8453)\n- Use mainnet wallet addresses\n- All links in the response point to mainnet explorers\n\n---\n\n## Debugging Tips\n\n1. **Check the response body** - Error messages are descriptive and include the specific validation issue\n\n2. **Validate locally first** - Test your request data with a JSON validator and address checker before sending\n\n3. **Verify on Basescan** - After a successful launch, use the explorer link to confirm the token exists\n\n4. **Test with minimal data** - Start with just `name`, `symbol`, and `wallet` before adding optional fields\n\n---\n\n## Example Error Responses\n\n### Validation Error (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Validation failed: symbol: Token symbol must be 10 characters or less\"\n}\n```\n\n### Rate Limit (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Daily launch limit reached (1 per day)\"\n}\n```\n\n### Server Error (500)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Transaction failed: insufficient funds for gas\"\n}\n```\n\nArchive v1.0.0: 8 files, 14504 bytes\n\nFiles: examples/agent-launcher.ts (6395b), examples/launch-token.ts (4164b), examples/list-tokens.ts (3322b), examples/package.example.json (490b), reference.md (10269b), SKILL.md (7364b), troubleshooting.md (5120b), _meta.json (134b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: openserv-launch\ndescription: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, deploying memecoins, or building agents that create projects with locked LP.\n---\n\n# OpenServ Launch API\n\nLaunch tokens instantly on Base blockchain with one-sided concentrated liquidity pools on Aerodrome Slipstream.\n\n**Reference files:**\n\n- `reference.md` - Full API reference for all endpoints\n- `troubleshooting.md` - Common issues and solutions\n- `examples/` - Complete code examples\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\n---\n\n## What This API Does\n\n- **Deploys ERC-20 tokens** - 1 billion supply, standard token contract\n- **Creates Aerodrome CL pools** - One-sided liquidity with 2,000,000x price range\n- **Locks LP for 1 year** - Automatic rug-pull protection\n- **Splits fees 50/50** - Creator wallet receives 50% of all trading fees\n\n---\n\n## Quick Start\n\n### Dependencies\n\n```bash\nnpm install axios\n```\n\n### Launch a Token\n\n```typescript\nimport axios from 'axios'\n\nconst response = await axios.post('https://instant-launch.openserv.ai/api/launch', {\n  name: 'My Token',\n  symbol: 'MTK',\n  wallet: '0x1234567890abcdef1234567890abcdef12345678',\n  description: 'A cool memecoin',\n  imageUrl: 'https://example.com/logo.png',\n  website: 'https://mytoken.com',\n  twitter: '@mytoken'\n})\n\nconsole.log(response.data)\n// {\n//   success: true,\n//   token: { address: '0x...', name: 'My Token', symbol: 'MTK', supply: '1000000000' },\n//   pool: { address: '0x...', tickSpacing: 500, fee: '2%' },\n//   locker: { address: '0x...', lpTokenId: '12345', lockedUntil: '2027-02-03T...' },\n//   txHashes: { tokenDeploy: '0x...', lpMint: '0x...', lock: '0x...', buy: '0x...' },\n//   links: { explorer: '...', aerodrome: '...', dexscreener: '...' }\n// }\n```\n\n---\n\n## Endpoints Overview\n\n| Endpoint              | Method | Description                      |\n| --------------------- | ------ | -------------------------------- |\n| `/api/launch`         | POST   | Create a new token with LP pool  |\n| `/api/tokens`         | GET    | List launched tokens             |\n| `/api/tokens/:address`| GET    | Get token details by address     |\n\n---\n\n## Launch Request Fields\n\n| Field       | Type   | Required | Description                                      |\n| ----------- | ------ | -------- | ------------------------------------------------ |\n| `name`      | string | Yes      | Token name (1-64 characters)                     |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)   |\n| `description` | string | No     | Token description (max 500 characters)          |\n| `imageUrl`  | string | No       | Direct link to image file (jpg, png, gif, webp, svg) |\n| `website`   | string | No       | Website URL (must start with http/https)        |\n| `twitter`   | string | No       | Twitter handle (with or without @)              |\n\n---\n\n## Launch Response\n\n```typescript\ninterface LaunchResponse {\n  success: true\n  internalId: string           // Database record ID\n  creator: string              // Creator wallet address\n  token: {\n    address: string            // Deployed token contract\n    name: string\n    symbol: string\n    supply: string             // Always \"1000000000\"\n  }\n  pool: {\n    address: string            // Aerodrome CL pool\n    tickSpacing: number        // 500\n    fee: string                // \"2%\"\n  }\n  locker: {\n    address: string            // LP locker contract\n    lpTokenId: string          // NFT position ID\n    lockedUntil: string        // ISO date (1 year from launch)\n  }\n  txHashes: {\n    tokenDeploy: string        // Token deployment tx\n    stakingTransfer: string    // 5% staking allocation tx\n    lpMint: string             // LP position mint tx\n    lock: string               // LP lock tx\n    buy: string                // Initial buy tx\n  }\n  links: {\n    explorer: string           // Basescan token page\n    aerodrome: string          // Aerodrome swap page\n    dexscreener: string        // DEXScreener chart\n    defillama: string          // DefiLlama swap\n  }\n}\n```\n\n---\n\n## Token Defaults\n\n| Setting            | Value              |\n| ------------------ | ------------------ |\n| Token Supply       | 1 billion          |\n| Initial Market Cap | $15,000            |\n| Price Range        | 2,000,000x (~$30B) |\n| Pool Fee           | 2%                 |\n| Tick Spacing       | 500                |\n| Fee Split          | 50/50 (creator/platform) |\n| Lock Duration      | 1 year             |\n| Staking Allocation | 5%                 |\n| Initial Buy        | 0.0005 ETH         |\n\n---\n\n## Example: Agent with Token Launch Capability\n\n```typescript\nimport { Agent, run } from '@openserv-labs/sdk'\nimport { provision, triggers } from '@openserv-labs/client'\nimport { z } from 'zod'\nimport axios from 'axios'\n\nconst agent = new Agent({\n  systemPrompt: 'You help users launch tokens on Base blockchain.'\n})\n\nagent.addCapability({\n  name: 'launch_token',\n  description: 'Launch a new ERC-20 token with LP pool on Aerodrome',\n  schema: z.object({\n    name: z.string().describe('Token name (1-64 chars)'),\n    symbol: z.string().describe('Token symbol (1-10 chars, uppercase)'),\n    wallet: z.string().describe('Creator wallet address'),\n    description: z.string().optional().describe('Token description'),\n    imageUrl: z.string().optional().describe('Logo image URL'),\n    website: z.string().optional().describe('Website URL'),\n    twitter: z.string().optional().describe('Twitter handle')\n  }),\n  async run({ args }) {\n    const response = await axios.post('https://instant-launch.openserv.ai/api/launch', args)\n    const { token, pool, links } = response.data\n    return `Token launched! Address: ${token.address}, Pool: ${pool.address}, Trade: ${links.aerodrome}`\n  }\n})\n\nasync function main() {\n  await provision({\n    agent: {\n      instance: agent,\n      name: 'token-launcher',\n      description: 'Launch tokens on Base with Aerodrome LP'\n    },\n    workflow: {\n      name: 'default',\n      trigger: triggers.webhook({ waitForCompletion: true })\n    }\n  })\n  await run(agent)\n}\n\nmain().catch(console.error)\n```\n\n---\n\n## Rate Limits\n\n- **1 token per wallet per 24 hours** (spam prevention)\n- Creator wallet must have on-chain activity (not empty)\n\n---\n\n## Network\n\nAll tokens are deployed on **Base Mainnet** (chainId: 8453).\n\n---\n\n## Updating This Skill\n\nThis skill may be outdated. The OpenServ team ships updates regularly—new features, API changes, and bug fixes won't be reflected here until you update. **If something isn't working as expected, or you want to make sure you have the latest information, update the skill before proceeding.**\n\n```bash\n# Check if updates are available\nnpx skills check\n\n# Update all installed skills to latest versions\nnpx skills update\n```\n\nOr reinstall the OpenServ skills directly:\n\n```bash\nnpx skills add openserv-labs/skills\n```\n\n---\n\n## Related Skills\n\n- **openserv-agent-sdk** - Build agents with token launch capabilities\n- **openserv-client** - Provision and deploy agents on the platform\n- **openserv-multi-agent-workflows** - Multi-agent collaboration patterns\n- **openserv-ideaboard-api** - Find ideas and ship token-related services\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn78n8z9y2n0v517vcy9gmy8q180jfmx\",\n  \"slug\": \"openserv-launch\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1770637663376\n}\n\nFile v1.0.0:reference.md\n\n# OpenServ Launch API Reference\n\nComplete API reference for all endpoints.\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\nFor examples, see `examples/` folder.\n\n---\n\n## POST /api/launch\n\nCreate a new token with one-sided LP pool on Aerodrome Slipstream.\n\n**When to use:** Launch a new ERC-20 token with automatic liquidity pool creation and LP locking.\n\n### Request Body\n\n| Field       | Type   | Required | Description                                        |\n| ----------- | ------ | -------- | -------------------------------------------------- |\n| `name`      | string | Yes      | Token name (1-64 characters)                       |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)      |\n| `description` | string | No     | Token description (max 500 characters)             |\n| `imageUrl`  | string | No       | Direct image URL (jpg, jpeg, png, gif, webp, svg, avif, bmp, ico) |\n| `website`   | string | No       | Website URL (must start with http:// or https://)  |\n| `twitter`   | string | No       | Twitter handle (with or without @, max 15 chars)   |\n\n### Example Request\n\n```bash\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"wallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\"\n  }'\n```\n\n### Example Response (201 Created)\n\n```json\n{\n  \"success\": true,\n  \"internalId\": \"65f1a2b3c4d5e6f7g8h9i0j1\",\n  \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"supply\": \"1000000000\"\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"txHashes\": {\n    \"tokenDeploy\": \"0x1111111111111111111111111111111111111111111111111111111111111111\",\n    \"stakingTransfer\": \"0x2222222222222222222222222222222222222222222222222222222222222222\",\n    \"lpMint\": \"0x3333333333333333333333333333333333333333333333333333333333333333\",\n    \"lock\": \"0x4444444444444444444444444444444444444444444444444444444444444444\",\n    \"buy\": \"0x5555555555555555555555555555555555555555555555555555555555555555\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x9876543210fedcba9876543210fedcba98765432\",\n    \"defillama\": \"https://swap.defillama.com/?chain=base&from=0x0000000000000000000000000000000000000000&tab=swap&to=0xabcdef1234567890abcdef1234567890abcdef12\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description                                           |\n| ------ | ----------------------------------------------------- |\n| 400    | Validation error (invalid name, symbol, wallet, etc.) |\n| 400    | Daily launch limit reached (1 per wallet per 24h)     |\n| 400    | Creator wallet has no on-chain activity               |\n| 500    | Transaction failed (insufficient gas, RPC error)      |\n\n---\n\n## GET /api/tokens\n\nList launched tokens with pagination.\n\n**When to use:** Browse all tokens launched via the API, optionally filtered by creator.\n\n### Query Parameters\n\n| Parameter | Type   | Default | Description                         |\n| --------- | ------ | ------- | ----------------------------------- |\n| `limit`   | number | 50      | Items per page (1-100)              |\n| `page`    | number | 1       | Page number (1-based)               |\n| `creator` | string | -       | Filter by creator wallet address    |\n\n### Example Request\n\n```bash\n# List first page of tokens\ncurl \"https://instant-launch.openserv.ai/api/tokens\"\n\n# Filter by creator\ncurl \"https://instant-launch.openserv.ai/api/tokens?creator=0x1234...\"\n\n# Paginate results\ncurl \"https://instant-launch.openserv.ai/api/tokens?limit=10&page=2\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"tokens\": [\n    {\n      \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n      \"name\": \"My Token\",\n      \"symbol\": \"MTK\",\n      \"description\": \"A revolutionary memecoin\",\n      \"imageUrl\": \"https://example.com/logo.png\",\n      \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n      \"pool\": \"0x9876543210fedcba9876543210fedcba98765432\",\n      \"locker\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n      \"initialMarketCapUsd\": 15000,\n      \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n      \"links\": {\n        \"explorer\": \"https://basescan.org/token/0x...\",\n        \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n        \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"limit\": 50,\n    \"page\": 1,\n    \"totalDocs\": 100,\n    \"totalPages\": 2,\n    \"hasPrevPage\": false,\n    \"hasNextPage\": true,\n    \"prevPage\": null,\n    \"nextPage\": 2\n  }\n}\n```\n\n---\n\n## GET /api/tokens/:address\n\nGet detailed information about a specific token by its contract address.\n\n**When to use:** Fetch complete token details including pool configuration, locker info, and transaction hashes.\n\n### Path Parameters\n\n| Parameter | Type   | Required | Description                    |\n| --------- | ------ | -------- | ------------------------------ |\n| `address` | string | Yes      | Token contract address (0x...) |\n\n### Example Request\n\n```bash\ncurl \"https://instant-launch.openserv.ai/api/tokens/0xabcdef1234567890abcdef1234567890abcdef12\"\n```\n\n### Example Response\n\n```json\n{\n  \"success\": true,\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\",\n    \"supply\": \"1000000000\",\n    \"decimals\": 18\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"tickLower\": -887200,\n    \"tickUpper\": 0,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"fees\": {\n    \"creatorWallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"platformWallet\": \"0x...\",\n    \"creatorShare\": \"50%\",\n    \"platformShare\": \"50%\"\n  },\n  \"transactions\": {\n    \"tokenDeploy\": \"0x1111...\",\n    \"lpMint\": \"0x3333...\",\n    \"lock\": \"0x4444...\"\n  },\n  \"meta\": {\n    \"chainId\": 8453,\n    \"initialMarketCapUsd\": 15000,\n    \"launchedAt\": \"2026-02-05T10:30:00.000Z\",\n    \"createdAt\": \"2026-02-05T10:30:00.000Z\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0x...\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0x...\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x...\"\n  }\n}\n```\n\n### Error Responses\n\n| Status | Description       |\n| ------ | ----------------- |\n| 400    | Invalid address   |\n| 404    | Token not found   |\n\n---\n\n## Error Format\n\nAll errors follow this format:\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Detailed error message\"\n}\n```\n\nCommon validation errors include:\n\n- `Token name is required`\n- `Token name must be 64 characters or less`\n- `Token symbol is required`\n- `Token symbol must be 10 characters or less`\n- `Token symbol must contain only letters and numbers`\n- `Invalid Ethereum address format`\n- `Description must be 500 characters or less`\n- `Image URL must be a direct link to an image file`\n- `Website must be a valid URL`\n- `Invalid Twitter handle format`\n- `Daily launch limit reached (1 per day)`\n\n---\n\n## Contract Addresses (Base Mainnet)\n\n| Contract                    | Address                                      |\n| --------------------------- | -------------------------------------------- |\n| CLFactory                   | `0xaDe65c38CD4849aDBA595a4323a8C7DdfE89716a` |\n| NonfungiblePositionManager  | `0xa990c6a764b73bf43cee5bb40339c3322fb9d55f` |\n| CLPoolLauncher              | `0xb9A1094D614c70B94C2CD7b4efc3A6adC6e6F4d3` |\n| CLLockerFactory             | `0x8BF02b8da7a6091Ac1326d6db2ed25214D812219` |\n| Universal Router            | `0x6Df1c91424F79E40E33B1A48F0687B666bE71075` |\n| WETH                        | `0x4200000000000000000000000000000000000006` |\n\n---\n\n## TypeScript Types\n\n```typescript\n// Request body for POST /api/launch\ninterface LaunchRequest {\n  name: string            // 1-64 chars\n  symbol: string          // 1-10 chars, uppercase, alphanumeric\n  wallet: string          // Valid Ethereum address\n  description?: string    // Max 500 chars\n  imageUrl?: string       // Direct image URL\n  website?: string        // http/https URL\n  twitter?: string        // Twitter handle\n}\n\n// Response from POST /api/launch\ninterface LaunchResponse {\n  success: true\n  internalId: string\n  creator: string\n  token: {\n    address: string\n    name: string\n    symbol: string\n    supply: string\n  }\n  pool: {\n    address: string\n    tickSpacing: number\n    fee: string\n  }\n  locker: {\n    address: string\n    lpTokenId: string\n    lockedUntil: string\n  }\n  txHashes: {\n    tokenDeploy: string\n    stakingTransfer: string\n    lpMint: string\n    lock: string\n    buy: string\n  }\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n    defillama: string\n  }\n}\n\n// Token in list response\ninterface TokenListItem {\n  address: string\n  name: string\n  symbol: string\n  description: string\n  imageUrl?: string\n  creator: string\n  pool: string\n  locker: string\n  initialMarketCapUsd: number\n  launchedAt: string\n  links: {\n    explorer: string\n    aerodrome: string\n    dexscreener: string\n  }\n}\n\n// Pagination info\ninterface Pagination {\n  limit: number\n  page: number\n  totalDocs: number\n  totalPages: number\n  hasPrevPage: boolean\n  hasNextPage: boolean\n  prevPage: number | null\n  nextPage: number | null\n}\n```\n\nFile v1.0.0:troubleshooting.md\n\n# OpenServ Launch API Troubleshooting\n\nCommon issues and solutions when launching tokens.\n\n---\n\n## Validation Errors\n\n### \"Token name is required\" or \"Token symbol is required\"\n\n**Problem:** Missing required fields in the request body.\n\n**Solution:**\n\n- Include both `name` and `symbol` in your request\n- Ensure the Content-Type header is set to `application/json`\n- Verify the JSON is valid (no trailing commas, properly quoted strings)\n\n### \"Token symbol must contain only letters and numbers\"\n\n**Problem:** Symbol contains invalid characters.\n\n**Solution:**\n\n- Use only A-Z and 0-9 in the symbol\n- The API will automatically uppercase the symbol\n- No spaces, hyphens, or special characters allowed\n\n### \"Invalid Ethereum address format\"\n\n**Problem:** The `wallet` field is not a valid Ethereum address.\n\n**Solution:**\n\n- Use a full 42-character address starting with `0x`\n- Ensure all characters are valid hexadecimal (0-9, a-f, A-F)\n- Verify the address using viem's `isAddress()` or ethers' `isAddress()`\n\n### \"Image URL must be a direct link to an image file\"\n\n**Problem:** The `imageUrl` doesn't point to an actual image file.\n\n**Solution:**\n\n- Use a direct URL ending with an image extension: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.svg`, `.avif`, `.bmp`, `.ico`\n- Query parameters after the extension are allowed (e.g., `logo.png?v=1`)\n- Don't use URLs to web pages that display images (e.g., Imgur gallery pages)\n\n### \"Invalid Twitter handle format\"\n\n**Problem:** Twitter handle doesn't match expected format.\n\n**Solution:**\n\n- Use 1-15 alphanumeric characters or underscores\n- The `@` prefix is optional (both `@mytoken` and `mytoken` work)\n- No spaces or special characters\n\n---\n\n## Rate Limiting\n\n### \"Daily launch limit reached (1 per day)\"\n\n**Problem:** The creator wallet has already launched a token in the past 24 hours.\n\n**Solution:**\n\n- Wait 24 hours from the previous launch\n- Use a different creator wallet address\n- This limit is per wallet, not per IP or API key\n\n### Creator wallet validation failed\n\n**Problem:** The wallet address doesn't have sufficient on-chain activity.\n\n**Solution:**\n\n- Ensure the wallet has made at least one transaction on Base\n- The wallet should have some ETH balance or transaction history\n- This is a spam prevention measure\n\n---\n\n## Transaction Failures\n\n### \"Transaction failed\" or timeout errors\n\n**Problem:** Blockchain transaction didn't complete successfully.\n\n**Solution:**\n\n1. Check Base network status for congestion\n2. Retry the request (the API is idempotent for failed launches)\n3. Verify the API's deployer wallet has sufficient ETH for gas\n\n### \"Insufficient funds\" error\n\n**Problem:** The API's deployer wallet doesn't have enough ETH.\n\n**Solution:**\n\n- This is a server-side issue; contact the API operator\n- The deployer needs ~0.01 ETH for a typical launch\n\n---\n\n## Response Parsing\n\n### Missing fields in response\n\n**Problem:** Expected fields are missing from the API response.\n\n**Solution:**\n\n- Optional fields (`description`, `imageUrl`, `website`, `twitter`) only appear if provided\n- Check the `success` field first to confirm the launch succeeded\n- On error, look for the `error` field instead of normal response fields\n\n### Invalid JSON response\n\n**Problem:** Response is not valid JSON.\n\n**Solution:**\n\n- Check the response status code (2xx for success, 4xx/5xx for errors)\n- Verify you're hitting the correct endpoint\n- Check for network issues or proxy interference\n\n---\n\n## Common Mistakes\n\n### Missing Content-Type header\n\n**Problem:** Request fails with unexpected errors.\n\n**Solution:**\n\n```bash\n# Always include Content-Type for POST requests\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"...\", ...}'\n```\n\n### Sending form data instead of JSON\n\n**Problem:** API returns validation errors for all fields.\n\n**Solution:**\n\n- Send JSON body, not form data\n- Use `JSON.stringify()` in JavaScript\n- Set `Content-Type: application/json`\n\n### Using testnet addresses\n\n**Problem:** Token launches but isn't visible on Base mainnet.\n\n**Solution:**\n\n- The API only operates on Base Mainnet (chainId: 8453)\n- Use mainnet wallet addresses\n- All links in the response point to mainnet explorers\n\n---\n\n## Debugging Tips\n\n1. **Check the response body** - Error messages are descriptive and include the specific validation issue\n\n2. **Validate locally first** - Test your request data with a JSON validator and address checker before sending\n\n3. **Verify on Basescan** - After a successful launch, use the explorer link to confirm the token exists\n\n4. **Test with minimal data** - Start with just `name`, `symbol`, and `wallet` before adding optional fields\n\n---\n\n## Example Error Responses\n\n### Validation Error (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Validation failed: symbol: Token symbol must be 10 characters or less\"\n}\n```\n\n### Rate Limit (400)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Daily launch limit reached (1 per day)\"\n}\n```\n\n### Server Error (500)\n\n```json\n{\n  \"success\": false,\n  \"error\": \"Transaction failed: insufficient funds for gas\"\n}\n```\n\nFile v1.0.0:examples/package.example.json\n\n{\n  \"name\": \"openserv-launch-examples\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"launch\": \"tsx launch-token.ts\",\n    \"list\": \"tsx list-tokens.ts\",\n    \"agent\": \"tsx agent-launcher.ts\"\n  },\n  \"dependencies\": {\n    \"@openserv-labs/sdk\": \"^2.1.0\",\n    \"@openserv-labs/client\": \"^2.0.0\",\n    \"axios\": \"^1.7.0\",\n    \"dotenv\": \"^16.4.5\",\n    \"openai\": \"^5.0.1\",\n    \"zod\": \"^3.23.8\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^20.14.9\",\n    \"tsx\": \"^4.16.0\",\n    \"typescript\": \"^5.5.2\"\n  }\n}","readmeExcerpt":"Skill: OpenServ Launch Owner: issa-me-sush Summary: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-02-16T20:59:26.927Z | user - Added example environment file: examples/env.example - No changes to documentation or core functionality. - This update provides","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"npm install axios"},{"language":"typescript","snippet":"import axios from 'axios'\n\nconst response = await axios.post('https://instant-launch.openserv.ai/api/launch', {\n  name: 'My Token',\n  symbol: 'MTK',\n  wallet: '0x1234567890abcdef1234567890abcdef12345678',\n  description: 'A cool memecoin',\n  imageUrl: 'https://example.com/logo.png',\n  website: 'https://mytoken.com',\n  twitter: '@mytoken'\n})\n\nconsole.log(response.data)\n// {\n//   success: true,\n//   token: { address: '0x...', name: 'My Token', symbol: 'MTK', supply: '1000000000' },\n//   pool: { address: '0x...', tickSpacing: 500, fee: '2%' },\n//   locker: { address: '0x...', lpTokenId: '12345', lockedUntil: '2027-02-03T...' },\n//   txHashes: { tokenDeploy: '0x...', lpMint: '0x...', lock: '0x...', buy: '0x...' },\n//   links: { explorer: '...', aerodrome: '...', dexscreener: '...' }\n// }"},{"language":"typescript","snippet":"interface LaunchResponse {\n  success: true\n  internalId: string           // Database record ID\n  creator: string              // Creator wallet address\n  token: {\n    address: string            // Deployed token contract\n    name: string\n    symbol: string\n    supply: string             // Always \"1000000000\"\n  }\n  pool: {\n    address: string            // Aerodrome CL pool\n    tickSpacing: number        // 500\n    fee: string                // \"2%\"\n  }\n  locker: {\n    address: string            // LP locker contract\n    lpTokenId: string          // NFT position ID\n    lockedUntil: string        // ISO date (1 year from launch)\n  }\n  txHashes: {\n    tokenDeploy: string        // Token deployment tx\n    stakingTransfer: string    // 5% staking allocation tx\n    lpMint: string             // LP position mint tx\n    lock: string               // LP lock tx\n    buy: string                // Initial buy tx\n  }\n  links: {\n    explorer: string           // Basescan token page\n    aerodrome: string          // Aerodrome swap page\n    dexscreener: string        // DEXScreener chart\n    defillama: string          // DefiLlama swap\n  }\n}"},{"language":"typescript","snippet":"import { Agent, run } from '@openserv-labs/sdk'\nimport { provision, triggers } from '@openserv-labs/client'\nimport { z } from 'zod'\nimport axios from 'axios'\n\nconst agent = new Agent({\n  systemPrompt: 'You help users launch tokens on Base blockchain.'\n})\n\nagent.addCapability({\n  name: 'launch_token',\n  description: 'Launch a new ERC-20 token with LP pool on Aerodrome',\n  schema: z.object({\n    name: z.string().describe('Token name (1-64 chars)'),\n    symbol: z.string().describe('Token symbol (1-10 chars, uppercase)'),\n    wallet: z.string().describe('Creator wallet address'),\n    description: z.string().optional().describe('Token description'),\n    imageUrl: z.string().optional().describe('Logo image URL'),\n    website: z.string().optional().describe('Website URL'),\n    twitter: z.string().optional().describe('Twitter handle')\n  }),\n  async run({ args }) {\n    const response = await axios.post('https://instant-launch.openserv.ai/api/launch', args)\n    const { token, pool, links } = response.data\n    return `Token launched! Address: ${token.address}, Pool: ${pool.address}, Trade: ${links.aerodrome}`\n  }\n})\n\nasync function main() {\n  await provision({\n    agent: {\n      instance: agent,\n      name: 'token-launcher',\n      description: 'Launch tokens on Base with Aerodrome LP'\n    },\n    workflow: {\n      name: 'Token Launcher',\n      goal: 'Launch ERC-20 tokens on Base blockchain with Aerodrome concentrated liquidity pools',\n      trigger: triggers.webhook({ waitForCompletion: true, timeout: 600 })\n    }\n  })\n  await run(agent)\n}\n\nmain().catch(console.error)"},{"language":"bash","snippet":"# Check if updates are available\nnpx skills check\n\n# Update all installed skills to latest versions\nnpx skills update"},{"language":"bash","snippet":"npx skills add openserv-labs/skills"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: openserv-launch\ndescription: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, deploying memecoins, or building agents that create tokens with locked LP. Read reference.md for the full API reference. Read openserv-agent-sdk and openserv-client for building and running agents. You can launch tokens for your OpenServ agents.\n---\n\n# OpenServ Launch API\n\nLaunch tokens instantly on Base blockchain with one-sided concentrated liquidity pools on Aerodrome Slipstream.\n\n**Reference files:**\n\n- `reference.md` - Full API reference for all endpoints\n- `troubleshooting.md` - Common issues and solutions\n- `examples/` - Complete code examples\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\n---\n\n## What This API Does\n\n- **Deploys ERC-20 tokens** - 1 billion supply, standard token contract\n- **Creates Aerodrome CL pools** - One-sided liquidity with 2,000,000x price range\n- **Locks LP for 1 year** - Automatic rug-pull protection\n- **Splits fees 50/50** - Creator wallet receives 50% of all trading fees\n\n---\n\n## Quick Start\n\n### Dependencies\n\n```bash\nnpm install axios\n```\n\n### Launch a Token\n\n```typescript\nimport axios from 'axios'\n\nconst response = await axios.post('https://instant-launch.openserv.ai/api/launch', {\n  name: 'My Token',\n  symbol: 'MTK',\n  wallet: '0x1234567890abcdef1234567890abcdef12345678',\n  description: 'A cool memecoin',\n  imageUrl: 'https://example.com/logo.png',\n  website: 'https://mytoken.com',\n  twitter: '@mytoken'\n})\n\nconsole.log(response.data)\n// {\n//   success: true,\n//   token: { address: '0x...', name: 'My Token', symbol: 'MTK', supply: '1000000000' },\n//   pool: { address: '0x...', tickSpacing: 500, fee: '2%' },\n//   locker: { address: '0x...', lpTokenId: '12345', lockedUntil: '2027-02-03T...' },\n//   txHashes: { tokenDeploy: '0x...', lpMint: '0x...', lock: '0x...', buy: '0x...' },\n//   links: { explorer: '...', aerodrome: '...', dexscreener: '...' }\n// }\n```\n\n---\n\n## Endpoints Overview\n\n| Endpoint              | Method | Description                      |\n| --------------------- | ------ | -------------------------------- |\n| `/api/launch`         | POST   | Create a new token with LP pool  |\n| `/api/tokens`         | GET    | List launched tokens             |\n| `/api/tokens/:address`| GET    | Get token details by address     |\n\n---\n\n## Launch Request Fields\n\n| Field       | Type   | Required | Description                                      |\n| ----------- | ------ | -------- | ------------------------------------------------ |\n| `name`      | string | Yes      | Token name (1-64 characters)                     |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)   |\n| `description` | string | No     | Token description (max 500 characters)          |\n| `imageUrl`  | string | No       | Direct l"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn78n8z9y2n0v517vcy9gmy8q180jfmx\",\n  \"slug\": \"openserv-launch\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1771275566927\n}"},{"path":"reference.md","content":"# OpenServ Launch API Reference\n\nComplete API reference for all endpoints.\n\n**Base URL:** `https://instant-launch.openserv.ai`\n\nFor examples, see `examples/` folder.\n\n---\n\n## POST /api/launch\n\nCreate a new token with one-sided LP pool on Aerodrome Slipstream.\n\n**When to use:** Launch a new ERC-20 token with automatic liquidity pool creation and LP locking.\n\n### Request Body\n\n| Field       | Type   | Required | Description                                        |\n| ----------- | ------ | -------- | -------------------------------------------------- |\n| `name`      | string | Yes      | Token name (1-64 characters)                       |\n| `symbol`    | string | Yes      | Token symbol (1-10 chars, uppercase, alphanumeric) |\n| `wallet`    | string | Yes      | Creator wallet address (receives 50% of fees)      |\n| `description` | string | No     | Token description (max 500 characters)             |\n| `imageUrl`  | string | No       | Direct image URL (jpg, jpeg, png, gif, webp, svg, avif, bmp, ico) |\n| `website`   | string | No       | Website URL (must start with http:// or https://)  |\n| `twitter`   | string | No       | Twitter handle (with or without @, max 15 chars)   |\n\n### Example Request\n\n```bash\ncurl -X POST \"https://instant-launch.openserv.ai/api/launch\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"wallet\": \"0x1234567890abcdef1234567890abcdef12345678\",\n    \"description\": \"A revolutionary memecoin\",\n    \"imageUrl\": \"https://example.com/logo.png\",\n    \"website\": \"https://mytoken.com\",\n    \"twitter\": \"@mytoken\"\n  }'\n```\n\n### Example Response (201 Created)\n\n```json\n{\n  \"success\": true,\n  \"internalId\": \"65f1a2b3c4d5e6f7g8h9i0j1\",\n  \"creator\": \"0x1234567890abcdef1234567890abcdef12345678\",\n  \"token\": {\n    \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"name\": \"My Token\",\n    \"symbol\": \"MTK\",\n    \"supply\": \"1000000000\"\n  },\n  \"pool\": {\n    \"address\": \"0x9876543210fedcba9876543210fedcba98765432\",\n    \"tickSpacing\": 500,\n    \"fee\": \"2%\"\n  },\n  \"locker\": {\n    \"address\": \"0xfedcba9876543210fedcba9876543210fedcba98\",\n    \"lpTokenId\": \"12345\",\n    \"lockedUntil\": \"2027-02-05T10:30:00.000Z\"\n  },\n  \"txHashes\": {\n    \"tokenDeploy\": \"0x1111111111111111111111111111111111111111111111111111111111111111\",\n    \"stakingTransfer\": \"0x2222222222222222222222222222222222222222222222222222222222222222\",\n    \"lpMint\": \"0x3333333333333333333333333333333333333333333333333333333333333333\",\n    \"lock\": \"0x4444444444444444444444444444444444444444444444444444444444444444\",\n    \"buy\": \"0x5555555555555555555555555555555555555555555555555555555555555555\"\n  },\n  \"links\": {\n    \"explorer\": \"https://basescan.org/token/0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"aerodrome\": \"https://aerodrome.finance/swap?from=eth&to=0xabcdef1234567890abcdef1234567890abcdef12\",\n    \"dexscreener\": \"https://dexscreener.com/base/0x9876543210fedcba9876543210fedcba98765432\",\n    \"defillama\": \"https://swap.defillama.com/?chain"},{"path":"troubleshooting.md","content":"# OpenServ Launch API Troubleshooting\n\nCommon issues and solutions when launching tokens.\n\n---\n\n## Validation Errors\n\n### \"Token name is required\" or \"Token symbol is required\"\n\n**Problem:** Missing required fields in the request body.\n\n**Solution:**\n\n- Include both `name` and `symbol` in your request\n- Ensure the Content-Type header is set to `application/json`\n- Verify the JSON is valid (no trailing commas, properly quoted strings)\n\n### \"Token symbol must contain only letters and numbers\"\n\n**Problem:** Symbol contains invalid characters.\n\n**Solution:**\n\n- Use only A-Z and 0-9 in the symbol\n- The API will automatically uppercase the symbol\n- No spaces, hyphens, or special characters allowed\n\n### \"Invalid Ethereum address format\"\n\n**Problem:** The `wallet` field is not a valid Ethereum address.\n\n**Solution:**\n\n- Use a full 42-character address starting with `0x`\n- Ensure all characters are valid hexadecimal (0-9, a-f, A-F)\n- Verify the address using viem's `isAddress()`\n\n### \"Image URL must be a direct link to an image file\"\n\n**Problem:** The `imageUrl` doesn't point to an actual image file.\n\n**Solution:**\n\n- Use a direct URL ending with an image extension: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.svg`, `.avif`, `.bmp`, `.ico`\n- Query parameters after the extension are allowed (e.g., `logo.png?v=1`)\n- Don't use URLs to web pages that display images (e.g., Imgur gallery pages)\n\n### \"Invalid Twitter handle format\"\n\n**Problem:** Twitter handle doesn't match expected format.\n\n**Solution:**\n\n- Use 1-15 alphanumeric characters or underscores\n- The `@` prefix is optional (both `@mytoken` and `mytoken` work)\n- No spaces or special characters\n\n---\n\n## Rate Limiting\n\n### \"Daily launch limit reached (1 per day)\"\n\n**Problem:** The creator wallet has already launched a token in the past 24 hours.\n\n**Solution:**\n\n- Wait 24 hours from the previous launch\n- Use a different creator wallet address\n- This limit is per wallet, not per IP or API key\n\n### Creator wallet validation failed\n\n**Problem:** The wallet address doesn't have sufficient on-chain activity.\n\n**Solution:**\n\n- Ensure the wallet has made at least one transaction on Base\n- The wallet should have some ETH balance or transaction history\n- This is a spam prevention measure\n\n---\n\n## Transaction Failures\n\n### \"Transaction failed\" or timeout errors\n\n**Problem:** Blockchain transaction didn't complete successfully.\n\n**Solution:**\n\n1. Check Base network status for congestion\n2. Retry the request (the API is idempotent for failed launches)\n3. Verify the API's deployer wallet has sufficient ETH for gas\n\n### \"Insufficient funds\" error\n\n**Problem:** The API's deployer wallet doesn't have enough ETH.\n\n**Solution:**\n\n- This is a server-side issue; contact the API operator\n- The deployer needs ~0.01 ETH for a typical launch\n\n---\n\n## Response Parsing\n\n### Missing fields in response\n\n**Problem:** Expected fields are missing from the API response.\n\n**Solution:**\n\n- Optional fields (`description`, `imageUrl`, `websi"},{"path":"examples/env.example.txt","content":"# OpenServ Launch Examples - Environment Variables\n\n# Your wallet address (receives 50% of trading fees)\n# Required for launching tokens\nCREATOR_WALLET=\n\n# Optional: OpenAI API key (for agent example)\nOPENAI_API_KEY="}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d... Skill: OpenServ Launch Owner: issa-me-sush Summary: Launch tokens on Base blockchain via the OpenServ Launch API. Creates ERC-20 tokens with Aerodrome concentrated liquidity pools. Use when launching tokens, d... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-02-16T20:59:26.927Z | user - Added example environment file: examples/env.example - No changes to documentation or core functionality. - This update provides","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1362,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T14:23:49.279Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:35:18.322Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}