plugin-fizzl

▶ Watch the 39-second video: install, then an agent answers "which coins are bullish on the 4h?" and "where would the stop go?", paying per call.
ElizaOS plugin that gives your agent 10 paid tools for crypto: ranked trade setups across 148 coins, trading signals, a market scan, price levels with stop and targets, and safety checks before it signs or pays. Your agent pays per call in USDC on Solana or Base over x402: no API keys, no accounts, no subscriptions.
You: What should I trade on the 4h? Top 3.
Agent: Trade setups 4h: 44 in 147 coins (31 long · 13 short; R/R ≥ 1.5)
1. FIL LONG · entry 1.1323 · stop 1.1012 · targets 1.1993 / 1.2585 · R/R 2.15 (6 of 6 indicators bullish)
2. KMNO LONG · entry 0.04987 · stop 0.048255 · targets 0.053802 / 0.055767 · R/R 2.43 (6 of 6 indicators bullish)
3. JST LONG · entry 0.12271 · stop 0.12146 · targets 0.12517 / 0.12759 · R/R 1.97 (6 of 6 indicators bullish; …)
Paid via x402: https://solscan.io/tx/…
You: Which coins are bullish on the 4h?
Agent: Market scan 4h: 98 of 148 coins bullish (98 bullish · 21 neutral · 29 bearish)
Bullish (98): QNT +18.8% · XPL +16.1% · BP +15.7% · ONDO +14.1% · USELESS +8.94% · …
% = price distance above (+) or below (−) the Ichimoku cloud. Not trade advice.
Paid via x402: https://solscan.io/tx/…
A FIZZL_SERVICES provider tells the agent which of these tools it has and which wallets pay for them.
Install
npm install plugin-fizzl # or: npm install github:Fizzl13/plugin-fizzl
import { fizzlPlugin } from "plugin-fizzl";
export const character = {
name: "TraderBot",
plugins: ["plugin-fizzl"], // or pass fizzlPlugin in a project's agent plugins
settings: {
secrets: {
SVM_PRIVATE_KEY: process.env.SVM_PRIVATE_KEY, // Solana wallet with USDC
EVM_PRIVATE_KEY: process.env.EVM_PRIVATE_KEY, // Base wallet with USDC
},
},
};
Settings
With both keys configured, services that accept both are paid on Solana; all of them accept USDC on Solana, so a Solana key alone is enough. Use a dedicated wallet holding only what the agent may spend; the spend cap limits a single payment, not the total.
Signed verdicts
x402 Doctor and presign-guard sign every paid answer (EIP-191 over canonical JSON, with the request inside the signed body). The preflight, diagnose and presign actions check that signature before the agent uses the verdict:
- signed by the service's published signer, pinned in the plugin: x402 Doctor
0xAaE66eF9Ee234397df33901568c8FBc36d43277d, presign-guard0xf084Ea47Ca4D99BB4De3ECB0332b316bE6521EaE; - for exactly the request the agent sent (endpoint and budget, or the transaction or signature to check).
Key rotation: a service can change its signing key without a plugin update. The Fizzl payout wallet (0x6B0F4651eD42893ab58139938175E4a69f175F25, the payTo of every payment) certifies each key, and the certificate travels inside the receipt; the plugin accepts a key that is pinned or certified for that service.
A valid answer ends with "Signed by x402 Doctor ✓" (or presign-guard). A changed, unsigned or foreign answer, or one for another request, is not used: the action fails with "Do not pay on it" or "Do not sign until it can be checked".
What the agent understands
- “What does the Ichimoku cloud say for SOL/USDT on the 4h?” →
SOL-USDT,4h - “Is $JUP above the cloud on the daily?” →
JUP-USDT,1d - “RSI, MACD and the other indicators for ETH on the 4h?” → confluence,
ETH-USDT,4h - “Where are support and resistance for BTC, and where would the stop go?” → price levels,
BTC-USDT - “Scan the market on the daily: which coins are strongest?” → market scan,
1d - “Which coins are bearish on the 4h?” → market scan,
4h, bearish only - “Are the NFT approvals on 0x6B0F…5F25 safe on arbitrum?” → wallet check,
arbitrum,nft - “Is this approval safe?
json {…}” → explain the payload - “Is it safe to sign this? {"primaryType":"Permit","domain":{…},"message":{…}}” → presign check of the typed data
- “Is this Solana transaction safe to sign? AQAAAA…” (the base64 wire transaction) → presign check of the Solana transaction
(chain from
domain.chainId); a transaction{ "to", "data", "value", "chainId" }works too
Check before signing, in code
FIZZL_PRESIGN_CHECK also works as a guard in your own signing path:
import { FizzlClient, presignCheck } from "plugin-fizzl";
const client = await FizzlClient.create({ evmPrivateKey: process.env.EVM_PRIVATE_KEY });
const urls = { ichimoku: "", plaintext: "", doctor: "", presign: "https://presign-guard.fizzl.eu" };
const check = await presignCheck(client, urls, {
request: { type: "signature", chainId: 8453, typedData }, // what you are about to sign
explain: false,
lang: "en",
});
if (!check.ok || check.data?.verdict !== "green") throw new Error("Not signing: " + (check.data?.verdict ?? check.error));
An error (presign-guard or a data source down) returns no verdict and costs nothing: treat it as "do not sign yet".
The LLM can also pass parameters directly (pair, interval; address, chain, kind; data; typedData,
transaction or request, explain, lang), which take
precedence over what is parsed from the message. Replies include the settlement transaction (Solscan/Basescan), and
the action result carries the structured response in data and the verdict/signal in values for chained actions.
Development
npm install
npm test # builds, then runs the tests
The tests pay fixture x402 services that behave like the live ones and verify every payment the way a facilitator
does: the payer's Ed25519 signature on the Solana transaction and the EIP-3009 signature on Base. They cover network
preference, the spend cap, rejected payments, missing wallets, message parsing and validate.
Releasing
Publishing runs in GitHub Actions (.github/workflows/publish.yml) and needs an NPM_TOKEN repository secret: an npm granular access token with read and write access to packages.
- Bump
versioninpackage.jsonand merge tomain. - Tag that commit and push the tag (
git tag v0.1.1 && git push origin v0.1.1), or run "Publish to npm" from the Actions tab onmain.
The workflow checks that the tag matches the version, runs the tests and publishes.
