{
  "schemaVersion": "1.0",
  "item": {
    "slug": "solana-easy-swap",
    "name": "Solana Easy Swap",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/in-liberty420/solana-easy-swap",
    "canonicalUrl": "https://clawhub.ai/in-liberty420/solana-easy-swap",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/solana-easy-swap",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=solana-easy-swap",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "examples/agent-prompt.md",
      "package-lock.json",
      "package.json",
      "scripts/swap.mjs"
    ],
    "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-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-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/solana-easy-swap"
    },
    "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/solana-easy-swap",
    "agentPageUrl": "https://openagent3.xyz/skills/solana-easy-swap/agent",
    "manifestUrl": "https://openagent3.xyz/skills/solana-easy-swap/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/solana-easy-swap/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": "Solana Easy Swap",
        "body": "Swap any Solana token from chat. Say \"swap 1 SOL for USDC\" and it handles everything — quoting, signing, sending, confirming. No API keys, no wallet extensions, no setup beyond a keypair. Powered by Jupiter."
      },
      {
        "title": "Setup",
        "body": "First run: Install dependencies (automatic if install spec is supported, otherwise manual):\n\ncd {baseDir} && npm install --production\n\nRequired env var:\n\nSOLANA_KEYPAIR_PATH — path to a Solana keypair JSON file (standard solana-keygen format). This skill reads your keypair to sign transactions. Only use with a keypair you trust this skill to access.\n\nOptional env vars:\n\nSOLANA_RPC_URL — custom RPC endpoint (default: https://api.mainnet-beta.solana.com)\nOSS_DEFAULT_SLIPPAGE_BPS — default slippage in basis points (default: 100 = 1%)\nOSS_PRIORITY_FEE_FLOOR — minimum priority fee in lamports (default: 50000)\n\nNo API keys required. Jupiter is used unauthenticated."
      },
      {
        "title": "Common Token Mints",
        "body": "TokenMintSOL (wrapped)So11111111111111111111111111111111111111112USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1vUSDTEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\n\nFor other tokens, ask the user for the mint address."
      },
      {
        "title": "1. Prepare",
        "body": "node {baseDir}/scripts/swap.mjs prepare \\\n  --from So11111111111111111111111111111111111111112 \\\n  --to EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \\\n  --amount 1000000000 \\\n  --slippage 100\n\nReturns JSON:\n\n{\n  \"prepareId\": \"abc123\",\n  \"expectedOut\": \"150230000\",\n  \"minOut\": \"148727700\",\n  \"priceImpact\": \"0.01\",\n  \"expiresAt\": \"2025-02-13T20:00:00Z\",\n  \"summary\": {\n    \"from\": \"1 SOL\",\n    \"to\": \"~150.23 USDC\",\n    \"minReceived\": \"148.73 USDC\",\n    \"slippage\": \"1%\",\n    \"priceImpact\": \"0.01%\",\n    \"destination\": \"owner\"\n  }\n}\n\nAlways show the summary to the user and wait for confirmation before executing.\n\nIf priceImpact > 1%, warn the user explicitly."
      },
      {
        "title": "2. Execute",
        "body": "After user confirms:\n\nnode {baseDir}/scripts/swap.mjs execute --prepareId abc123\n\nReturns JSON:\n\n{\n  \"signature\": \"5UzV...\",\n  \"submittedAt\": \"2025-02-13T19:58:12Z\"\n}"
      },
      {
        "title": "3. Status (poll until confirmed)",
        "body": "node {baseDir}/scripts/swap.mjs status --signature 5UzV...\n\nReturns JSON:\n\n{\n  \"state\": \"confirmed\",\n  \"slot\": 123456789,\n  \"confirmationStatus\": \"finalized\"\n}\n\nStates: submitted → confirmed | failed | expired | unknown"
      },
      {
        "title": "4. Receipt",
        "body": "node {baseDir}/scripts/swap.mjs receipt --signature 5UzV...\n\nReturns JSON with actual amounts swapped, fees, and a Solscan link."
      },
      {
        "title": "Error Handling",
        "body": "All commands return JSON with error field on failure:\n\n{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_SOL\",\n    \"message\": \"Not enough SOL for fees. Have 0.001, need ~0.006\",\n    \"retryable\": false\n  }\n}\n\nError codes and retry guidance:\n\nCodeRetry?ActionINVALID_INPUTNoFix the inputINSUFFICIENT_SOLNoTell user they need more SOLKEYPAIR_NOT_FOUNDNoCheck SOLANA_KEYPAIR_PATH is setKEYPAIR_INVALIDNoCheck keypair file formatPREPARE_EXPIREDYesRun prepare again, re-confirm with userPREPARE_ALREADY_EXECUTEDNoThis swap was already sentBACKEND_UNAVAILABLEYesWait 3s, retry prepare up to 2xBACKEND_QUOTE_FAILEDNoNo route — tell user (bad pair or no liquidity)TX_EXPIREDYesRun prepare again, re-confirm with userTX_BROADCAST_FAILEDYesRetry execute once (if not expired)TX_FAILED_ONCHAINNoSwap failed (e.g., slippage). Do NOT retry.RPC_UNAVAILABLEYesWait 3s, retry up to 2x"
      },
      {
        "title": "Agent Guidelines",
        "body": "Always confirm before executing. Show the user the summary from prepare and wait for explicit \"yes\" / \"go\" / \"confirm\".\nNever auto-retry failed onchain transactions. If TX_FAILED_ONCHAIN, the tx landed and failed — retrying sends a new tx.\nRe-confirm on re-prepare. If you need to prepare again (expired quote), show the new summary — prices may have changed.\nHandle amounts in base units. SOL = 9 decimals (1 SOL = 1000000000), USDC = 6 decimals (1 USDC = 1000000).\nAsk for mint addresses if the user mentions a token you don't recognize. Don't guess.\nReport the Solscan link after confirmation: https://solscan.io/tx/{signature}"
      },
      {
        "title": "Security",
        "body": "This skill signs transactions using the configured keypair. It does NOT create, import, or manage keys.\nKeypair material is never logged, echoed, or included in any output.\nThird-party destinations require explicit --allowThirdParty flag.\nAll swaps enforce slippage protection via minOut.\nPrepared swaps expire after 120 seconds by default."
      },
      {
        "title": "Limitations (v1)",
        "body": "Jupiter unauthenticated API — Token2022 and pump.fun tokens may not work.\nNo best-price routing — takes whatever Jupiter returns.\nReceipt amounts are best-effort (derived from pre/post balance diffs).\nSolana mainnet only."
      }
    ],
    "body": "Solana Easy Swap\n\nSwap any Solana token from chat. Say \"swap 1 SOL for USDC\" and it handles everything — quoting, signing, sending, confirming. No API keys, no wallet extensions, no setup beyond a keypair. Powered by Jupiter.\n\nSetup\n\nFirst run: Install dependencies (automatic if install spec is supported, otherwise manual):\n\ncd {baseDir} && npm install --production\n\n\nRequired env var:\n\nSOLANA_KEYPAIR_PATH — path to a Solana keypair JSON file (standard solana-keygen format). This skill reads your keypair to sign transactions. Only use with a keypair you trust this skill to access.\n\nOptional env vars:\n\nSOLANA_RPC_URL — custom RPC endpoint (default: https://api.mainnet-beta.solana.com)\nOSS_DEFAULT_SLIPPAGE_BPS — default slippage in basis points (default: 100 = 1%)\nOSS_PRIORITY_FEE_FLOOR — minimum priority fee in lamports (default: 50000)\n\nNo API keys required. Jupiter is used unauthenticated.\n\nCommon Token Mints\nToken\tMint\nSOL (wrapped)\tSo11111111111111111111111111111111111111112\nUSDC\tEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\nUSDT\tEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\n\nFor other tokens, ask the user for the mint address.\n\nFlow\n1. Prepare\nnode {baseDir}/scripts/swap.mjs prepare \\\n  --from So11111111111111111111111111111111111111112 \\\n  --to EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \\\n  --amount 1000000000 \\\n  --slippage 100\n\n\nReturns JSON:\n\n{\n  \"prepareId\": \"abc123\",\n  \"expectedOut\": \"150230000\",\n  \"minOut\": \"148727700\",\n  \"priceImpact\": \"0.01\",\n  \"expiresAt\": \"2025-02-13T20:00:00Z\",\n  \"summary\": {\n    \"from\": \"1 SOL\",\n    \"to\": \"~150.23 USDC\",\n    \"minReceived\": \"148.73 USDC\",\n    \"slippage\": \"1%\",\n    \"priceImpact\": \"0.01%\",\n    \"destination\": \"owner\"\n  }\n}\n\n\nAlways show the summary to the user and wait for confirmation before executing.\n\nIf priceImpact > 1%, warn the user explicitly.\n\n2. Execute\n\nAfter user confirms:\n\nnode {baseDir}/scripts/swap.mjs execute --prepareId abc123\n\n\nReturns JSON:\n\n{\n  \"signature\": \"5UzV...\",\n  \"submittedAt\": \"2025-02-13T19:58:12Z\"\n}\n\n3. Status (poll until confirmed)\nnode {baseDir}/scripts/swap.mjs status --signature 5UzV...\n\n\nReturns JSON:\n\n{\n  \"state\": \"confirmed\",\n  \"slot\": 123456789,\n  \"confirmationStatus\": \"finalized\"\n}\n\n\nStates: submitted → confirmed | failed | expired | unknown\n\n4. Receipt\nnode {baseDir}/scripts/swap.mjs receipt --signature 5UzV...\n\n\nReturns JSON with actual amounts swapped, fees, and a Solscan link.\n\nError Handling\n\nAll commands return JSON with error field on failure:\n\n{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_SOL\",\n    \"message\": \"Not enough SOL for fees. Have 0.001, need ~0.006\",\n    \"retryable\": false\n  }\n}\n\n\nError codes and retry guidance:\n\nCode\tRetry?\tAction\nINVALID_INPUT\tNo\tFix the input\nINSUFFICIENT_SOL\tNo\tTell user they need more SOL\nKEYPAIR_NOT_FOUND\tNo\tCheck SOLANA_KEYPAIR_PATH is set\nKEYPAIR_INVALID\tNo\tCheck keypair file format\nPREPARE_EXPIRED\tYes\tRun prepare again, re-confirm with user\nPREPARE_ALREADY_EXECUTED\tNo\tThis swap was already sent\nBACKEND_UNAVAILABLE\tYes\tWait 3s, retry prepare up to 2x\nBACKEND_QUOTE_FAILED\tNo\tNo route — tell user (bad pair or no liquidity)\nTX_EXPIRED\tYes\tRun prepare again, re-confirm with user\nTX_BROADCAST_FAILED\tYes\tRetry execute once (if not expired)\nTX_FAILED_ONCHAIN\tNo\tSwap failed (e.g., slippage). Do NOT retry.\nRPC_UNAVAILABLE\tYes\tWait 3s, retry up to 2x\nAgent Guidelines\nAlways confirm before executing. Show the user the summary from prepare and wait for explicit \"yes\" / \"go\" / \"confirm\".\nNever auto-retry failed onchain transactions. If TX_FAILED_ONCHAIN, the tx landed and failed — retrying sends a new tx.\nRe-confirm on re-prepare. If you need to prepare again (expired quote), show the new summary — prices may have changed.\nHandle amounts in base units. SOL = 9 decimals (1 SOL = 1000000000), USDC = 6 decimals (1 USDC = 1000000).\nAsk for mint addresses if the user mentions a token you don't recognize. Don't guess.\nReport the Solscan link after confirmation: https://solscan.io/tx/{signature}\nSecurity\nThis skill signs transactions using the configured keypair. It does NOT create, import, or manage keys.\nKeypair material is never logged, echoed, or included in any output.\nThird-party destinations require explicit --allowThirdParty flag.\nAll swaps enforce slippage protection via minOut.\nPrepared swaps expire after 120 seconds by default.\nLimitations (v1)\nJupiter unauthenticated API — Token2022 and pump.fun tokens may not work.\nNo best-price routing — takes whatever Jupiter returns.\nReceipt amounts are best-effort (derived from pre/post balance diffs).\nSolana mainnet only."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/in-liberty420/solana-easy-swap",
    "publisherUrl": "https://clawhub.ai/in-liberty420/solana-easy-swap",
    "owner": "in-liberty420",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/solana-easy-swap",
    "downloadUrl": "https://openagent3.xyz/downloads/solana-easy-swap",
    "agentUrl": "https://openagent3.xyz/skills/solana-easy-swap/agent",
    "manifestUrl": "https://openagent3.xyz/skills/solana-easy-swap/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/solana-easy-swap/agent.md"
  }
}