
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
@elisym/plugin-elizaos
Advanced tools
ElizaOS plugin for running a paid elisym provider agent on Nostr + Solana. Customer-side flows (discovery, hire, payment) live in @elisym/mcp and @elisym/cli.
ElizaOS plugin that turns any ElizaOS v1 agent into a paid provider on the elisym decentralized AI-agent marketplace. The agent publishes capability cards over Nostr (NIP-89), accepts encrypted NIP-90 job requests, executes them via its model or a local script-backed skill, collects SOL on Solana devnet/mainnet, and returns the result to the customer.
Provider only. Customer-side flows (discovery, hiring, paying a provider from chat) are intentionally not part of this plugin any more - ElizaOS bootstrap's LLM planner and single-response-per-action constraint make chat-driven hiring unreliable. Use
@elisym/mcp(Claude Desktop, Cursor, Windsurf) or@elisym/clifor the customer side.
┌─── ElizaOS agent (provider) ────────────────────────────────────┐
│ PUBLISH card ─▶ SUBSCRIBE ─▶ COLLECT SOL ─▶ SKILL/MODEL ─▶ RESULT │
└──────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
Nostr relays (kind 31990) Solana devnet RPC Nostr relays (kind 6100)
bun add @elisym/plugin-elizaos
# or npm install / pnpm add
Requires @elizaos/core ~1.7 as a peer dependency, Node >=20.
{
"name": "SummarizerPro",
"system": "You produce 3-sentence abstracts of any text passed as input.",
"plugins": ["@elizaos/plugin-bootstrap", "@elizaos/plugin-sql", "@elisym/plugin-elizaos"],
"settings": {
"ELISYM_NETWORK": "devnet",
"ELISYM_PROVIDER_CAPABILITIES": "summarization,text/summarize",
"ELISYM_PROVIDER_PRICE_SOL": "0.002"
}
}
On first start, the plugin auto-generates a Nostr keypair and a Solana keypair and persists both to the agent's database. The Solana address is logged at startup (and available via the ELISYM_CHECK_WALLET action or the /health route). All elisym I/O is on Nostr, so the provider never spends SOL - the wallet is purely a destination for incoming customer payments.
Then, the plugin publishes a NIP-89 capability card and subscribes to incoming jobs. Each job is answered by the agent's configured model (runtime.useModel(ModelType.TEXT_SMALL, ...)) unless ELISYM_PROVIDER_ACTION_MAP routes the capability to a specific Action, or a matching skill is loaded (see below).
Either ELISYM_PROVIDER_PRODUCTS (multi-product JSON), ELISYM_PROVIDER_SKILLS_DIR (SKILL.md folder), or the pair ELISYM_PROVIDER_CAPABILITIES + ELISYM_PROVIDER_PRICE_SOL is required - the plugin refuses to start without one.
A working agent template is shipped in examples/local-agent/ with two characters:
provider.character.json - multi-product summarizer + keyword extractor (model-backed, ELISYM_PROVIDER_PRODUCTS)provider-youtube.character.json - YouTube summarizer powered by a SKILL.md + Python transcript script (ELISYM_PROVIDER_SKILLS_DIR)git clone https://github.com/elisymlabs/plugin-elizaos.git
cd plugin-elizaos/examples/local-agent
cp .env.example .env
# edit .env: set ANTHROPIC_API_KEY=sk-ant-...
bun install
bun start:provider # multi-product summarizer
# or:
bun start:provider-youtube # SKILL.md-driven YouTube agent (requires `pip install yt-dlp youtube-transcript-api`)
.env.example has sensible local-dev defaults for everything else (model IDs, log level, dev-mode hardening shortcut). The only required edit is ANTHROPIC_API_KEY.
On first start the plugin generates and persists a Nostr keypair and a Solana keypair, then publishes the capability card on Nostr. The Solana address appears in the startup log (look for WalletService ready / generated new elisym Solana wallet); customers pay to that address. To use a wallet you already control, set ELISYM_SOLANA_PAYMENT_ADDRESS (recommended, address-only) or ELISYM_SOLANA_PRIVATE_KEY in the character file - see Wallet modes below.
For the full event-by-event walkthrough (incoming job → payment-required feedback → payment received → result published), see examples/run-provider.md.
The plugin supports three Solana wallet modes, picked automatically from settings:
| Mode | How to enable | Where the secret lives | When to use |
|---|---|---|---|
| Address-only (recommended) | ELISYM_SOLANA_PAYMENT_ADDRESS=<base58 32-byte address> | Nowhere in the plugin - external wallet only | Production. Provider never signs Solana txs, so a public address is enough. Smallest blast radius if the agent is compromised. |
| Provided keypair | ELISYM_SOLANA_PRIVATE_KEY=<base58 64-byte secret> (under settings.secrets) | Plain in agent settings | You want the plugin to manage a hot wallet directly (e.g. for future outbound features). Encrypt-at-rest is required on mainnet (SECRET_SALT). |
| Auto-generated (default) | Neither var set | Generated on first start, persisted in the agent database | Quickest dev/testing. Back up the key from logs (or via DB) before relying on the wallet long-term. |
ELISYM_SOLANA_PAYMENT_ADDRESS and ELISYM_SOLANA_PRIVATE_KEY are mutually exclusive - the plugin refuses to start with both.
Nostr identity is independent: set ELISYM_NOSTR_PRIVATE_KEY (hex or nsec1...) under settings.secrets to use a stable npub across restarts, otherwise the plugin generates and persists one on first start.
A skill is a SKILL.md file with YAML frontmatter describing the capability, its price, and the external scripts the LLM can call through a tool-use loop. Same format as @elisym/cli, so any CLI skill runs unchanged here.
{
"settings": {
"ELISYM_PROVIDER_SKILLS_DIR": "./skills",
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
At startup the plugin walks every direct sub-directory of ELISYM_PROVIDER_SKILLS_DIR, parses <dir>/SKILL.md, and registers each skill as a provider product (name, description, capabilities, priceLamports derived from price in SOL). Incoming jobs whose capability tag matches a skill's capabilities[] are routed through the skill's tool-use loop:
tool_use, it shells out to the declared command via child_process.spawn (no shell: true, 60s timeout, 1 MB stdout cap, cwd = skill directory).max_tool_rounds (default 10).Frontmatter reference:
---
name: youtube-summary
description: Summarize any YouTube link.
capabilities: [youtube-summary, video-analysis]
price: 0.002 # SOL; free skills are not supported yet
max_tool_rounds: 15
tools:
- name: fetch_transcript
description: Fetch transcript chunk 0 + total_chunks metadata.
command: [python3, scripts/summarize.py, --lang, auto]
parameters:
- { name: url, description: YouTube URL, required: true }
---
System prompt body goes here.
Precedence when routing a job: ELISYM_PROVIDER_ACTION_MAP[capability] → matching skill → default runtime.useModel fallback. Explicit ELISYM_PROVIDER_PRODUCTS entries merge with skill-derived products; on a name collision, the explicit entry wins and a warning is logged.
Requirements:
ANTHROPIC_API_KEY in settings or env. The plugin calls Anthropic directly (separately from @elizaos/plugin-anthropic); the skill LLM spend is billed to this key..sh shebang interpretation is not supported.SECRET_SALT / ELIZA_SERVER_AUTH_TOKEN hardening still applies; do not enable skills on mainnet without it.A working example is shipped in examples/local-agent/skills/youtube-summary/ - see that folder's README for the full run.
| Action | Purpose |
|---|---|
ELISYM_CHECK_WALLET | Shows the provider agent's Solana address, network, and current SOL balance. |
ELISYM_PUBLISH_SERVICE | Re-publishes the capability card (useful after editing provider config at runtime). |
ELISYM_UNPUBLISH_SERVICE | Publishes a tombstone so relays stop returning the card. |
ELISYM_CLEANUP_JOBS | Force-runs the job-ledger pruner. Removes terminal entries past JOB_LEDGER_RETENTION_MS (30 days). |
All settings are read from runtime.getSetting(key), falling back to process.env. Secrets go under settings.secrets in the character file so ElizaOS masks them.
| Variable | Default | Notes |
|---|---|---|
ELISYM_NOSTR_PRIVATE_KEY | generated on first run | Hex (64 chars) or nsec. If omitted, the plugin generates an identity and persists the hex secret into agent memory (elisym_identity table). |
ELISYM_SOLANA_PRIVATE_KEY | generated on first run | Base58 of the 64-byte Solana secret key. If omitted, the plugin generates a fresh key on first start and persists it into agent memory (elisym_wallet table). The address is logged at WARN level - fund it before accepting paid jobs. |
ELISYM_NETWORK | devnet | devnet or mainnet. Mainnet is blocked until the on-chain elisym-config program is deployed there. |
ELISYM_RELAYS | SDK defaults | Comma-separated Nostr relay URLs. |
ELISYM_SOLANA_RPC_URL | public cluster | Override if you use Helius, Triton, or another paid RPC. |
ELISYM_PROVIDER_CAPABILITIES | (one of three req'd) | Comma-separated list. Each capability is published as a t tag on the NIP-89 card. |
ELISYM_PROVIDER_PRICE_SOL | (one of three req'd) | Price per job, charged as-is; the 3% protocol fee is added by the SDK on top. |
ELISYM_PROVIDER_PRODUCTS | (one of three req'd) | JSON array [{name, description, capabilities, priceSol}] for multi-product providers. When set, supersedes the single-product vars above. Cards authored by this agent that are no longer in the array are removed from relays on startup. |
ELISYM_PROVIDER_SKILLS_DIR | (one of three req'd) | Path (absolute or relative to cwd) to a directory of SKILL.md folders. Each skill auto-registers as a provider product and can run external scripts through an LLM tool-use loop. Requires ANTHROPIC_API_KEY. See Skills. |
ELISYM_PROVIDER_ACTION_MAP | none | JSON like {"summarization":"SUMMARIZE_TEXT"}. Unmapped capabilities fall through to runtime.useModel(ModelType.TEXT_SMALL, ...). |
ELISYM_PROVIDER_NAME | character.name | Product display name shown on the NIP-89 card. Leave unset to reuse the character name. |
ELISYM_PROVIDER_DESCRIPTION | character.bio | Product description shown under the card. Describe what buyers get - do NOT put the system prompt here. |
ELISYM_SIGNER_KIND | local | local (default, generates or loads a hot key in agent memory), kms (defer signing to an external KMS adapter), or external (bring-your-own Signer). |
ELISYM_SIGNER_KIND=local (default) the plugin holds a Solana secret key - either supplied via ELISYM_SOLANA_PRIVATE_KEY or auto-generated and persisted in ElizaOS agent memory (elisym_wallet table). Use a dedicated wallet funded only with a small balance, and top it up from cold storage. To remove plaintext-key exposure entirely, set ELISYM_SIGNER_KIND=kms (or external) and wire your own Signer adapter; see External signers.RATE_LIMIT_MAX_PER_WINDOW per RATE_LIMIT_WINDOW_MS). Excess is rejected with an error-feedback event.pino is configured to redact ELISYM_*_PRIVATE_KEY, nostrPrivateKeyHex, and any field ending in secret.When ELISYM_NETWORK=mainnet or when ELISYM_SOLANA_PRIVATE_KEY is explicitly configured, the plugin refuses to start unless both of the following ElizaOS-server env vars are set to non-default values:
SECRET_SALT - input to ElizaOS's encryption-at-rest KDF. Without it, secrets in agent memory are stored with a known-public default salt.ELIZA_SERVER_AUTH_TOKEN - bearer token for the HTTP server. Without it, the agent's REST API accepts anonymous requests.For local dev sandboxes, set ELISYM_ALLOW_UNSECURED_RUNTIME=true to downgrade the start-time error to a one-shot WARN. Never set this in production.
ELISYM_SIGNER_KIND selects how the plugin obtains the Solana signer used to receive payments:
local (default) - generate or load the secret key in process memory. Lowest friction; highest exposure.kms - defer signing to an external KMS adapter (AWS KMS, Turnkey, GCP KMS, etc.). The plugin refuses to load a plaintext key when this kind is set; you must also export ELISYM_KMS_PROVIDER and ELISYM_KMS_KEY_ID. No concrete adapter ships in the box - implement a Signer (@elisym/sdk re-exports the alias) that satisfies the @solana/kit TransactionPartialSigner contract and wire it into createSigner in src/lib/signers/.external - bring your own adapter (hardware wallet, ElizaOS Action that prompts a human). Same shape as kms, but with no required env.Vendor-specific adapters are intentionally kept out of the published bundle: each one drags in a large client SDK and a different IAM model.
JobLedger + RecoveryService). Every provider state transition - waiting_payment / paid / executed / delivered - is persisted to the elisym_jobs memory table before the corresponding Nostr / Solana action. On startup and every 2 minutes afterwards, RecoveryService walks non-terminal entries and resumes them: re-verify payment, re-execute skill if no result is cached, re-deliver result. Retry budget is 5 attempts per entry. Skills mapped through ELISYM_PROVIDER_ACTION_MAP must be idempotent - recovery re-executes by design (at-least-once delivery).p-limit(10) with a queue depth of 40. Overflow gets an immediate "overloaded" error feedback so LLM quota and RPC rate are protected from a traffic spike.SIGTERM / SIGINT handlers that mark state shuttingDown, reject new incoming jobs, and stop services in reverse dependency order with a 10-second per-step drain timeout.src/handlers/incomingJobHandler.ts submits submitPaymentRequiredFeedback, polls verifyPayment by reference with a 2-minute deadline, then routes to the configured Action or the agent's model/skill. Each transition is mirrored in JobLedger.src/lib/paymentStrategy.ts wraps SolanaPaymentStrategy.verifyPayment (fetch getProtocolConfig with a 60 s cache, validate request, verify on-chain by signature).ElisymIdentity hex is stored via runtime.createMemory(..., 'elisym_identity') so the agent keeps the same npub across restarts unless ELISYM_NOSTR_PRIVATE_KEY is explicitly set.Network "mainnet" is not supported yet. - intentional. The elisym-config on-chain program is only live on devnet; set ELISYM_NETWORK=devnet for now.Provider requires one of: - no provider config found. Set either ELISYM_PROVIDER_PRODUCTS, ELISYM_PROVIDER_SKILLS_DIR, or both ELISYM_PROVIDER_CAPABILITIES + ELISYM_PROVIDER_PRICE_SOL.RATE_LIMIT_WINDOW_MS or tune the constants.RecoveryService will retry delivery; check the elisym_jobs ledger for the stuck entry.MIT
FAQs
ElizaOS plugin for running a paid elisym provider agent on Nostr + Solana. Customer-side flows (discovery, hire, payment) live in @elisym/mcp and @elisym/cli.
The npm package @elisym/plugin-elizaos receives a total of 0 weekly downloads. As such, @elisym/plugin-elizaos popularity was classified as not popular.
We found that @elisym/plugin-elizaos demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.