{
  "schemaVersion": "1.0",
  "item": {
    "slug": "base-buds",
    "name": "Public",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/tron04736-star/base-buds",
    "canonicalUrl": "https://clawhub.ai/tron04736-star/base-buds",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/base-buds",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=base-buds",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "skill.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/base-buds"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/base-buds",
    "agentPageUrl": "https://openagent3.xyz/skills/base-buds/agent",
    "manifestUrl": "https://openagent3.xyz/skills/base-buds/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/base-buds/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Base Buds Mint",
        "body": "Mint a Base Bud NFT from the agent-only collection on Base mainnet."
      },
      {
        "title": "Key Files",
        "body": "FileURLSKILL.md (this file)https://budsbase.xyz/skill.md\n\nInstall locally:\n\nmkdir -p ~/.openclaw/skills/base-buds\ncurl -s https://budsbase.xyz/skill.md > ~/.openclaw/skills/base-buds/SKILL.md\n\nOr just read the URL directly!\n\nBase URL: https://budsbase.xyz/api"
      },
      {
        "title": "Prerequisites",
        "body": "An EVM wallet keypair with at least 0.00025-0.000415 ETH for gas and 1 USDC on Base mainnet (chain ID 8453)\nAbility to solve challenges (math, code, logic)"
      },
      {
        "title": "Security",
        "body": "Your EVM private key should never leave your local environment — signing happens locally\nThis skill makes only HTTP API calls. It does not access your filesystem, run shell commands, or execute arbitrary code"
      },
      {
        "title": "How It Works",
        "body": "The mint flow has four steps: challenge → prepare → complete (pay & get tx) → broadcast."
      },
      {
        "title": "Step 1: Request a challenge",
        "body": "curl -X POST https://budsbase.xyz/api/challenge \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"wallet\": \"YOUR_EVM_ADDRESS\"}'\n\nResponse:\n\n{\n  \"challengeId\": \"0xabc123...\",\n  \"puzzle\": \"What is 347 * 23 + 156?\",\n  \"expiresAt\": 1699999999999\n}"
      },
      {
        "title": "Step 2: Prepare & sign payment",
        "body": "A single node script that submits the challenge answer to /prepare, then signs the USDC payment locally. Your private key never leaves your machine.\n\nNote: /prepare returns only payment data — no mint transaction. The mint transaction is only available after payment settles in Step 3.\n\nimport { ethers } from \"ethers\";\n\nconst PK = \"YOUR_PRIVATE_KEY\";\nif (!/^0x[0-9a-fA-F]{64}$/.test(PK)) throw new Error(\"Invalid private key — must be 0x + 64 hex chars\");\nconst wallet = new ethers.Wallet(PK);\n\n// 2a. Submit challenge answer, get payment data\nconst res = await fetch(\"https://budsbase.xyz/api/prepare\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ wallet: wallet.address, challengeId: \"CHALLENGE_ID\", answer: \"ANSWER\" }),\n});\nconst { prepareId, payment } = await res.json();\n\n// 2b. Sign USDC payment (EIP-712)\nconst paymentSignature = await wallet.signTypedData(payment.domain, payment.types, payment.values);\n\nconsole.log(JSON.stringify({ prepareId, paymentSignature }));"
      },
      {
        "title": "Step 3: Complete (settle payment & get unsigned mint tx)",
        "body": "Submit the payment signature. The backend settles 1 USDC on-chain first, then returns the unsigned mint transaction.\n\ncurl -X POST https://budsbase.xyz/api/complete \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prepareId\": \"0x<from_step_2>\",\n    \"paymentSignature\": \"0x<from_step_2>\"\n  }'\n\nResponse:\n\n{\n  \"success\": true,\n  \"settleTxHash\": \"0x...\",\n  \"transaction\": { \"to\": \"0x...\", \"data\": \"0x...\", \"chainId\": 8453, \"nonce\": 5, \"type\": 2, \"...\" : \"...\" },\n  \"message\": \"Payment settled. Sign the transaction and POST to /api/broadcast.\"\n}"
      },
      {
        "title": "Step 4: Sign & broadcast",
        "body": "Sign the mint transaction locally, then submit it.\n\nimport { ethers } from \"ethers\";\n\nconst PK = \"YOUR_PRIVATE_KEY\";\nif (!/^0x[0-9a-fA-F]{64}$/.test(PK)) throw new Error(\"Invalid private key — must be 0x + 64 hex chars\");\nconst wallet = new ethers.Wallet(PK);\nconst transaction = /* transaction object from Step 3 */;\n\nconst signedTransaction = await wallet.signTransaction(transaction);\nconsole.log(JSON.stringify({ signedTransaction }));\n\ncurl -X POST https://budsbase.xyz/api/broadcast \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"signedTransaction\": \"0x<from_above>\"}'\n\nResponse:\n\n{\n  \"success\": true,\n  \"tokenId\": 9,\n  \"minter\": \"0x...\",\n  \"txHash\": \"0x...\",\n  \"minted\": 2,\n  \"remaining\": 18,\n  \"message\": \"Successfully minted Base Bud #9! You have minted 2 Base Buds. You can mint up to 18 more.\"\n}"
      },
      {
        "title": "Agent Behavior",
        "body": "The user will provide their wallet address and private key. That's all you need — handle the entire mint flow from there without asking further questions.\nStep 1 (challenge): use curl.\nStep 2 (prepare & sign payment): use a single node script that fetches /prepare and signs the USDC payment. Do NOT split this into separate curl + node steps.\n\nethers fallback: Before running the script, check if ethers is available: node -e \"require('ethers')\". If it fails, install to a temp location: npm install --prefix /tmp ethers, then run the script with NODE_PATH=/tmp/node_modules.\n\n\nStep 3 (complete): use curl — this settles payment and returns the unsigned mint tx.\nStep 4 (sign & broadcast): use a single node script that signs the transaction from Step 3, then use curl to POST the signed tx to /broadcast.\nAfter each step, briefly tell the user what happened before moving to the next.\nHandle errors gracefully — if a step fails, explain why and retry or stop.\nMint limit reached (409): If /challenge returns 409, ask the user for a new wallet address and private key, then restart the flow with the new wallet.\nNever expose the user's private key in output or logs.\nSigning must always happen locally — never send private keys over the network."
      },
      {
        "title": "/challenge",
        "body": "CodeMeaning400Invalid wallet address or missing fields409Wallet has reached the mint limit (20)410Collection is fully minted500Server error"
      },
      {
        "title": "/prepare",
        "body": "CodeMeaning400Invalid wallet address, missing fields403Challenge answer is incorrect or expired500Server error"
      },
      {
        "title": "/complete",
        "body": "All errors include a code field you can switch on:\n\ncodeHTTPMeaningmissing_prepare_id400No prepareId providedmissing_payment_signature400No paymentSignature providedprepare_session_expired400Session not found or expired — call /prepare againauthorization_expired400USDC authorization validBefore has passedauthorization_not_yet_valid400USDC authorization validAfter is in the futureinsufficient_usdc_balance400Wallet doesn't have enough USDCpayment_verification_failed402x402 facilitator rejected the payment signaturepayment_settlement_failed402x402 facilitator couldn't settle the USDC transfer"
      },
      {
        "title": "/broadcast",
        "body": "codeHTTPMeaningmissing_signed_transaction400No signedTransaction providednonce_too_low400Wallet has pending txs — call /complete againinsufficient_eth400Not enough ETH for gasalready_known409Transaction was already submittedmint_reverted400Mint transaction reverted on-chainbroadcast_failed500Failed to broadcast transaction"
      },
      {
        "title": "Notes",
        "body": "Chain: Base mainnet (chain ID 8453)\nx402 payment: 1 USDC per mint, paid via EIP-712 signed USDC TransferWithAuthorization\nTwo signing operations: EIP-712 for USDC payment (Step 2) + EIP-1559 for mint transaction (Step 4)\nChallenge expiration: Challenges expire after 5 minutes\nTotal supply: 6,000 NFTs\nUp to 20 mints per wallet\nGas cost: ~0.00025-0.000415 ETH per mint on Base"
      }
    ],
    "body": "Base Buds Mint\n\nMint a Base Bud NFT from the agent-only collection on Base mainnet.\n\nKey Files\nFile\tURL\nSKILL.md (this file)\thttps://budsbase.xyz/skill.md\n\nInstall locally:\n\nmkdir -p ~/.openclaw/skills/base-buds\ncurl -s https://budsbase.xyz/skill.md > ~/.openclaw/skills/base-buds/SKILL.md\n\n\nOr just read the URL directly!\n\nBase URL: https://budsbase.xyz/api\n\nPrerequisites\nAn EVM wallet keypair with at least 0.00025-0.000415 ETH for gas and 1 USDC on Base mainnet (chain ID 8453)\nAbility to solve challenges (math, code, logic)\nSecurity\nYour EVM private key should never leave your local environment — signing happens locally\nThis skill makes only HTTP API calls. It does not access your filesystem, run shell commands, or execute arbitrary code\nHow It Works\n\nThe mint flow has four steps: challenge → prepare → complete (pay & get tx) → broadcast.\n\nStep 1: Request a challenge\ncurl -X POST https://budsbase.xyz/api/challenge \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"wallet\": \"YOUR_EVM_ADDRESS\"}'\n\n\nResponse:\n\n{\n  \"challengeId\": \"0xabc123...\",\n  \"puzzle\": \"What is 347 * 23 + 156?\",\n  \"expiresAt\": 1699999999999\n}\n\nStep 2: Prepare & sign payment\n\nA single node script that submits the challenge answer to /prepare, then signs the USDC payment locally. Your private key never leaves your machine.\n\nNote: /prepare returns only payment data — no mint transaction. The mint transaction is only available after payment settles in Step 3.\n\nimport { ethers } from \"ethers\";\n\nconst PK = \"YOUR_PRIVATE_KEY\";\nif (!/^0x[0-9a-fA-F]{64}$/.test(PK)) throw new Error(\"Invalid private key — must be 0x + 64 hex chars\");\nconst wallet = new ethers.Wallet(PK);\n\n// 2a. Submit challenge answer, get payment data\nconst res = await fetch(\"https://budsbase.xyz/api/prepare\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ wallet: wallet.address, challengeId: \"CHALLENGE_ID\", answer: \"ANSWER\" }),\n});\nconst { prepareId, payment } = await res.json();\n\n// 2b. Sign USDC payment (EIP-712)\nconst paymentSignature = await wallet.signTypedData(payment.domain, payment.types, payment.values);\n\nconsole.log(JSON.stringify({ prepareId, paymentSignature }));\n\nStep 3: Complete (settle payment & get unsigned mint tx)\n\nSubmit the payment signature. The backend settles 1 USDC on-chain first, then returns the unsigned mint transaction.\n\ncurl -X POST https://budsbase.xyz/api/complete \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prepareId\": \"0x<from_step_2>\",\n    \"paymentSignature\": \"0x<from_step_2>\"\n  }'\n\n\nResponse:\n\n{\n  \"success\": true,\n  \"settleTxHash\": \"0x...\",\n  \"transaction\": { \"to\": \"0x...\", \"data\": \"0x...\", \"chainId\": 8453, \"nonce\": 5, \"type\": 2, \"...\" : \"...\" },\n  \"message\": \"Payment settled. Sign the transaction and POST to /api/broadcast.\"\n}\n\nStep 4: Sign & broadcast\n\nSign the mint transaction locally, then submit it.\n\nimport { ethers } from \"ethers\";\n\nconst PK = \"YOUR_PRIVATE_KEY\";\nif (!/^0x[0-9a-fA-F]{64}$/.test(PK)) throw new Error(\"Invalid private key — must be 0x + 64 hex chars\");\nconst wallet = new ethers.Wallet(PK);\nconst transaction = /* transaction object from Step 3 */;\n\nconst signedTransaction = await wallet.signTransaction(transaction);\nconsole.log(JSON.stringify({ signedTransaction }));\n\ncurl -X POST https://budsbase.xyz/api/broadcast \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"signedTransaction\": \"0x<from_above>\"}'\n\n\nResponse:\n\n{\n  \"success\": true,\n  \"tokenId\": 9,\n  \"minter\": \"0x...\",\n  \"txHash\": \"0x...\",\n  \"minted\": 2,\n  \"remaining\": 18,\n  \"message\": \"Successfully minted Base Bud #9! You have minted 2 Base Buds. You can mint up to 18 more.\"\n}\n\nAgent Behavior\nThe user will provide their wallet address and private key. That's all you need — handle the entire mint flow from there without asking further questions.\nStep 1 (challenge): use curl.\nStep 2 (prepare & sign payment): use a single node script that fetches /prepare and signs the USDC payment. Do NOT split this into separate curl + node steps.\nethers fallback: Before running the script, check if ethers is available: node -e \"require('ethers')\". If it fails, install to a temp location: npm install --prefix /tmp ethers, then run the script with NODE_PATH=/tmp/node_modules.\nStep 3 (complete): use curl — this settles payment and returns the unsigned mint tx.\nStep 4 (sign & broadcast): use a single node script that signs the transaction from Step 3, then use curl to POST the signed tx to /broadcast.\nAfter each step, briefly tell the user what happened before moving to the next.\nHandle errors gracefully — if a step fails, explain why and retry or stop.\nMint limit reached (409): If /challenge returns 409, ask the user for a new wallet address and private key, then restart the flow with the new wallet.\nNever expose the user's private key in output or logs.\nSigning must always happen locally — never send private keys over the network.\nError Codes\n/challenge\nCode\tMeaning\n400\tInvalid wallet address or missing fields\n409\tWallet has reached the mint limit (20)\n410\tCollection is fully minted\n500\tServer error\n/prepare\nCode\tMeaning\n400\tInvalid wallet address, missing fields\n403\tChallenge answer is incorrect or expired\n500\tServer error\n/complete\n\nAll errors include a code field you can switch on:\n\ncode\tHTTP\tMeaning\nmissing_prepare_id\t400\tNo prepareId provided\nmissing_payment_signature\t400\tNo paymentSignature provided\nprepare_session_expired\t400\tSession not found or expired — call /prepare again\nauthorization_expired\t400\tUSDC authorization validBefore has passed\nauthorization_not_yet_valid\t400\tUSDC authorization validAfter is in the future\ninsufficient_usdc_balance\t400\tWallet doesn't have enough USDC\npayment_verification_failed\t402\tx402 facilitator rejected the payment signature\npayment_settlement_failed\t402\tx402 facilitator couldn't settle the USDC transfer\n/broadcast\ncode\tHTTP\tMeaning\nmissing_signed_transaction\t400\tNo signedTransaction provided\nnonce_too_low\t400\tWallet has pending txs — call /complete again\ninsufficient_eth\t400\tNot enough ETH for gas\nalready_known\t409\tTransaction was already submitted\nmint_reverted\t400\tMint transaction reverted on-chain\nbroadcast_failed\t500\tFailed to broadcast transaction\nNotes\nChain: Base mainnet (chain ID 8453)\nx402 payment: 1 USDC per mint, paid via EIP-712 signed USDC TransferWithAuthorization\nTwo signing operations: EIP-712 for USDC payment (Step 2) + EIP-1559 for mint transaction (Step 4)\nChallenge expiration: Challenges expire after 5 minutes\nTotal supply: 6,000 NFTs\nUp to 20 mints per wallet\nGas cost: ~0.00025-0.000415 ETH per mint on Base"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/tron04736-star/base-buds",
    "publisherUrl": "https://clawhub.ai/tron04736-star/base-buds",
    "owner": "tron04736-star",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/base-buds",
    "downloadUrl": "https://openagent3.xyz/downloads/base-buds",
    "agentUrl": "https://openagent3.xyz/skills/base-buds/agent",
    "manifestUrl": "https://openagent3.xyz/skills/base-buds/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/base-buds/agent.md"
  }
}