plugin-signalpulse
v0.1.1
Published
ElizaOS plugin for SignalPulse: trade-signal scanners and natural-language market analysis across FX, metals, indices, equities, futures, crypto, 35+ sports, racing, golf, F1, fantasy, and prediction markets — quote-first x402 paid calls (USDC on Base) wi
Maintainers
Readme
plugin-signalpulse
ElizaOS plugin for SignalPulse — trade-signal
scanners and natural-language market analysis for agents, paid per call with x402 USDC on Base
(or a prepaid sp_ credit key). Coverage: FX, metals, indices, equities, futures, crypto,
35+ sports, horse & greyhound racing, golf, F1, fantasy, and prediction markets (Polymarket
weather / politics / macro / attention ladders) — the only sports/racing/prediction-market data
seller in the x402 agent economy.
Actions
| Action | Cost | What it does |
| --- | --- | --- |
| SEARCH_SIGNALPULSE_CATALOG | free | Search the machine catalog (/api/preflight): every paid endpoint with its exact per-call price, drift-locked server-side to what the handler actually charges. |
| SIGNALPULSE_SCAN | quotes | Quote a scan by name (crypto, forex, futures, market, sports, polymarket, racing, golf, F1, equities, crypto-lite) or by a catalog URL. Nothing is paid at quote time. |
| SIGNALPULSE_ANALYSIS | quotes | Quote a Market Analysis: your natural-language question is POSTed to /api/analysis ($1.49) — and hashed into the confirmation, so the authorization pays for exactly that question. |
| SIGNALPULSE_CONFIRM_PAYMENT | pays | The ONLY action that moves money: executes a pending quote when the user replies pay <CODE>. |
The money rules (inherited from plugin-pulsenetwork 0.2.0, registry-reviewed)
- Quote-first, content-bound confirm. Every paid call is first quoted (exact price, asset, recipient — and for analysis, the exact question). The confirmation code is derived from a hash over those exact operation bytes; agent-authored text can never trigger a payment, a code never authorizes anything but its own quote, and quotes expire in 10 minutes.
- Pinned payment policy. The plugin will only ever sign:
exact-scheme USDC on Base (eip155:8453) to SignalPulse's published wallet0x50ab2018c06c6E4eAA9BA52057Eb55eD284912fc, at or under the per-call cap. Any other challenge — different recipient, asset, network, amount, or EIP-712 domain — is refused in code before a signature exists. (SignalPulse also advertises Solana-USDC and USD1-on-BSC lanes; this plugin deliberately ignores them.) - Whole-message confirmation. Only a message that is
pay <CODE>authorizes a charge — after trimming, collapsing internal whitespace, and dropping one trailing./!. Nothing else is normalized:do not pay ABC123,why should I pay ABC123?,he said "pay ABC123", andpay ABC123 and buy moreare all refused (regression-tested). - Per-call cap (
SIGNALPULSE_MAX_PAYMENT_USD, default $2.60) and a daily budget (SIGNALPULSE_BUDGET_USD_PER_DAY, default $5.00, UTC; debited before payment, credited back only when the client proves no signature was created). The budget is exact for one runtime process per wallet and advisory across processes — see Deployment assumptions. - Execute-once, enforced on-chain. The EIP-3009
nonceof every signed transfer is the authorization hash (sha256 over the confirmed operation bytes). USDC records used nonces per payer, so one confirmed quote can settle at most once — even if two hosts sharing the wallet both act on it, the second signature fails at verification/settlement instead of moving money. The cache-backed charge ledger remains as the fast in-process check. On the host that loses that race the plugin sees a created-but-unsettled signature, records the charge asfailed, and keeps the budget debit (over-counting its own spend is the fail-safe direction). - Single host. Free or paid, every request goes to
signalpulse.theaslangroupllc.com— a prompt-injected URL cannot route a request (let alone a payment) anywhere else. - Server verdicts. Every paid 200 carries
agent_action: allow | warn | skip | block(derived server-side; model-emitted values are overwritten there).skipbodies are refund-honest: x402 buyers are never settled for a no-play. The plugin leads every paid reply with this verdict so downstream logic can branch without parsing prose. - Replay-protected retries. Server-side, a transport retry of an already-settled payment for the same URL is served as already-paid — buyers are never double-charged for a dropped response.
Settings
| Setting | Required | Meaning |
| --- | --- | --- |
| EVM_PRIVATE_KEY | for x402 | Base-mainnet key holding a few dollars of USDC (same setting the official EVM plugin uses). Not needed with an API key; the free catalog needs neither. |
| SIGNALPULSE_API_KEY | optional | An sp_ credit-pack key — paid calls deduct server-side credits instead of paying on-chain; no wallet involved. |
| SIGNALPULSE_MAX_PAYMENT_USD | optional | Per-call ceiling (default 2.60). Invalid/non-positive values disable paid calls (fail closed). |
| SIGNALPULSE_BUDGET_USD_PER_DAY | optional | Daily cumulative ceiling (default 5.00, UTC). Same fail-closed semantics. |
| SIGNALPULSE_AUTOPAY | optional | The string "true" skips the confirm step (headless agents). Unsafe in shared rooms; caps/budget/ledger still apply, and non-human triggers are still refused. |
Example
User: what crypto endpoints does signalpulse have?
Agent: SignalPulse endpoints matching "crypto" (price = exact per-call x402 charge, USDC on Base):
• GET /api/scan/crypto — $2 — Crypto scanner — Top-25 by market cap, ETF flows, funding, on-chain, GEX
• GET /api/scan/crypto-lite — $0.05 — deterministic BTC/ETH/SOL snapshot …
User: run the crypto scan
Agent: 💸 Payment required — nothing has been paid yet.
• Purpose: SignalPulse crypto scan
• Endpoint: GET https://signalpulse.theaslangroupllc.com/api/scan/crypto
• Price: $2.00 (2000000 atomic USDC) … Recipient: 0x50ab…12fc (SignalPulse wallet)
Reply "pay A91C04" within 10 minutes to authorize exactly this charge — nothing else.
User: pay A91C04
Agent: Paid $2.00 … ✅ agent_action: allow — the endpoint returned an actionable result. …Deployment assumptions
getCache/setCache are durable but not compare-and-swap. Two runtime processes sharing one
wallet therefore cannot double-pay a confirmed quote (the on-chain nonce guarantee above does
not depend on the cache), but they can each count the daily budget independently — the
SIGNALPULSE_BUDGET_USD_PER_DAY ceiling is exact per process, not per wallet. Run one agent
per key, or point multiple agents at separate wallets/budgets, if the budget must be global.
Development
npm install
npm run typecheck && npm test # 71 tests
npm run buildEVIDENCE.md holds live capture of the built plugin quoting real production 402s (catalog, GET
quote, POST quote) with the policy pins filtering the real multi-lane challenge.
Informational only — not financial, investment, or betting advice. Markets carry risk of loss.
