T08 · Insecure Dependencies
- Location
skill.md:23- Finding
Unpinned Third-Party Package Executes During Installation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is openly designed for paid API calls, but it relies on an unpinned npm package that auto-creates a funded crypto wallet and stores the private key as plaintext.
Install only if you are comfortable using a dedicated low-balance crypto wallet for API payments. Verify the npm package provenance and version before installing, keep only small amounts of USDC in the generated wallet, exclude the key file from backups and logs, and do not let agents read or display ~/.clawxpay/wallet.key.
skill.md:23Unpinned Third-Party Package Executes During Installation
skill.md:15Cryptocurrency Private Key Stored as Plaintext File
The manifest advertises creation and storage of a wallet private key in a predictable local path and describes exporting it with a shell command. Even though the skill says not to expose the key, normalizing direct filesystem secret storage in plaintext hex materially increases the chance that an agent, plugin, log collector, backup process, or compromised local environment will access or exfiltrate it. In a payment-enabled skill, compromise of this key can directly lead to wallet takeover and loss of funds.
---
name: clawxpay
description: >
Pay-per-call API gateway — zero account, zero API key, zero subscription via the x402 protocol.
One Base wallet + USDC is all you need to access 250+ professional API endpoints on a per-call basis:
real-time crypto prices and on-chain data (coinank · nofxos · coinmarketcap),
US stock options and technical indicators (alphavantage · polygon · alpaca · twelvedata),
China A-share market (tushare), Web3 project funding intelligence (rootdata),
and 7 AI model providers (OpenAI · Anthropic · DeepSeek · Qwen · Gemini · Grok · Kimi).
From $0.001 per call — s
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
console.error(`Balance insufficient — current: ${bal} USDC. Please top up.`);
} else if (err instanceof PaymentFailedError) {
// PaymentFailedError means the SDK DID attempt the x402 payment but the gateway rejected it.
// This is NOT "you forgot to pay" — do NOT ask the user to deposit more.
// Instead: check gateway status, or inspect debug logs above for the specific rejection reason.
console.error('Payment was attempted but gateway rejected it:', err.message);
console.error('Do NOT retry automatically — check gateway status first.');
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
| `Cannot find module 'clawxpay-js'` | Package not installed | `npm install clawxpay-js` |
| `require is not defined in ES module scope` | clawxpay-js is ESM-only; `require()` does not work | Save file as `.mjs` and use `import` instead |
| `clawxpay: command not found` | clawxpay-js is an SDK, not a CLI | Do not use it as a shell command; write a `.mjs` script and run `node script.mjs` |
| `PaymentFailedError` thrown | **The SDK already attempted x402 payment** but the gateway rejected it. This does NOT mean "you forgot to pay" — do not ask the user to deposit more USDC. | Enable `debug: true`, read the rejection reason in logs, check gateway status |
| `Error 402` before any `PaymentFailedError` | Raw 402 from a different error (script crashed before SDK loaded) | Check that your `.mjs` file loads without errors first; run `node --input-type=module <<< "import 'clawxpay-js'"` |
| `receipt.settled === false` after success | Gateway accepted the call but did not return a txHash — payment may not be on-chain | Check `https://basescan.org/address/<wallet>` to see if USDC left the wallet; report to gateway operator |
| `Balance shows 0` after depositing | Deposit still pending, or sent to wrong network | Wait ~30 s and retry; confirm deposit was on **Base mainnet**, not Ethereum mainnet |