curve/curve-gauge-yield-trader/SKILL.md
Multi-chain Curve gauge yield trading skill with paper-first defaults. Supports local wallet generation or Ledger signer mode for live execution.
npx skillsauth add serenorg/seren-skills curve-gauge-yield-traderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Skill instructions are preloaded in context when this skill is active. Do not perform filesystem searches or tool-driven exploration to rediscover them; use the guidance below directly.
Immediately run a dry-run gauge scan and trade simulation without asking. Do not present a menu of modes. Execute:
cd ~/.config/seren/skills/curve-gauge-yield-trader && source .venv/bin/activate && python3 scripts/agent.py --config config.json
Display the full dry-run results to the user. Only after results are displayed, present available next steps (live mode). If the user explicitly requests a specific mode in their invocation message, run that mode instead.
fetch_top_gauges uses connector.curve_api.get (/getGauges)choose_trade uses transform.select_best_gaugesigner_setup uses transform.setup_signerrpc_discovery resolves chain RPC publisher from gateway catalog (GET /publishers)preflight builds and estimates local EVM transactions via chain RPC (no cloud signer)live_guard uses transform.guard_live_executionexecute_liquidity_trade signs locally and submits with eth_sendRawTransactioninputs.live_mode = true in config--yes-live on the CLIGET /publishers) and performs an explicit probe before preflight/trade.
rpc_publishers in config ({ "ethereum": "<slug>" }) to force a specific publisher slug per chain.wallet_mode=local: agent signs with local private key.wallet_mode=ledger: preflight creates unsigned txs; you provide signed raw txs in evm_execution.ledger.signed_raw_transactions for broadcast.This skill can trade real money. Use at your own risk. Past performance does not guarantee future results.
wallet_mode=local: generate a local wallet with --init-wallet, then fund that address.wallet_mode=ledger: provide Ledger address and use preflight output to sign externally.evm_execution.strategy = "gauge_stake_lp".
lp_token_address and lp_amount_wei if they cannot be derived from market data.gauge_address override.evm_execution.strategy = "custom_tx" and set:
evm_execution.custom_tx.toevm_execution.custom_tx.dataevm_execution.custom_tx.value_weievm_execution.tx.gas_price_multiplierevm_execution.tx.gas_limit_multiplierevm_execution.tx.fallback_gas_limitWhen the user says sell, close, exit, unwind, or flatten, treat that as an immediate operator instruction to stop trading and prepare the LP or gauge withdrawal path. If the user did not identify which chain or signer should be used, ask only the minimum clarifying question needed to identify it.
Before any live execution:
SEREN_API_KEY is loaded and the configured RPC publisher is reachable.eth-account for local signing, or a valid ledger address for ledger mode.eth-abi and eth-utils are installed when local EVM encoding is required.Dependency validation is required before live trading. Verify SEREN_API_KEY, the resolved RPC publisher, eth-account, eth-abi, eth-utils, and the selected signer inputs are installed and loaded. If a credential is missing, the RPC path is unsupported, or a required library is not installed, the runtime must stop with an error instead of submitting transactions.
To stop trading immediately, run python scripts/agent.py --config config.json --unwind-all. The unwind-all path syncs the tracked LP and gauge position, marks the position for liquidation, and returns the exact onchain addresses needed to unwind without placing a new entry order.
SEREN_API_KEY by following https://docs.serendb.com/skills.md, then set it in your environment (for example: export SEREN_API_KEY=...).config.example.json to config.json.pip install -r requirements.txtpython scripts/agent.py --init-wallet --wallet-path state/wallet.local.jsonpython scripts/agent.py --config config.jsoninputs.live_mode=true in configpython scripts/agent.py --config config.json --yes-liveUse seren-cron to run this skill on a schedule — no terminal windows to keep open, no daemons, no permanent computer changes required. Seren-cron is a cloud scheduler that calls your local trigger server on a cron schedule.
Each scheduled run executes one full cycle: sync positions, fetch top gauges, build local preflight txs, and execute if live mode is enabled and --yes-live is set on the server process.
Requirements: Seren Desktop login or a valid SEREN_API_KEY.
Before scheduling, verify the publisher is reachable using mcp__seren__call_publisher:
publisher: seren-cron
path: /health
method: GET
If this call fails, stop here and tell the user:
"The seren-cron service could not be reached. Please send this error to [email protected] for support."
Always check for existing scheduled jobs before creating a new one. A user may have forgotten a live job is already running.
publisher: seren-cron
path: /jobs
method: GET
If jobs for this skill already exist, show them to the user and ask:
"You have [N] active cron job(s) for this skill. Would you like to:
- Keep them running (recommended if intentional)
- Stop all and create a new schedule
- Cancel"
Do not create a duplicate cron job without explicit user confirmation.
Start the webhook server that seren-cron will call on each scheduled tick:
SEREN_API_KEY="$SEREN_API_KEY" python3 scripts/run_agent_server.py --config config.json --port 8080
This process runs in your terminal session. When you close the terminal, it stops — that is expected and correct. Seren-cron handles the scheduling; your local server handles execution.
With the server running, create the scheduled job:
publisher: seren-cron
path: /jobs
method: POST
body: {
"name": "curve-gauge-yield-trader-live",
"url": "http://localhost:8080/run",
"method": "POST",
"cron_expression": "*/30 * * * *",
"timezone": "UTC",
"enabled": true,
"timeout_seconds": 60
}
Save the returned job_id — you need it to pause, resume, or delete the job later.
List all active jobs:
publisher: seren-cron, path: /jobs, method: GET
Pause:
publisher: seren-cron, path: /jobs/{job_id}/pause, method: POST
Resume:
publisher: seren-cron, path: /jobs/{job_id}/resume, method: POST
Stop permanently:
publisher: seren-cron, path: /jobs/{job_id}, method: DELETE
If a live trade or cycle fails because the trading balance or SerenBucks balance is too low to execute, immediately pause the cron job:
publisher: seren-cron, path: /jobs/{job_id}/pause, method: POST
Then tell the user:
"Automated trading has been paused: insufficient funds detected. Please top up your balance before resuming the schedule."
Never allow the cron to keep firing when there are no funds available to trade.
testing
Review-first outreach skill for the default Seren Bucks affiliate program. It bootstraps affiliate context via /programs/discover, mines sent-mail history and address books for candidates, persists them into a skill-owned CRM, proposes an editable daily top-10, drafts outbound and reply batches for approval, reconciles affiliate and reply signals, enforces hard DNC, and returns a manual daily digest.
data-ai
Lean partner-link distribution skill for the seren-affiliates publisher program portfolio. Operates one publisher program per run. Bootstraps the affiliate profile (registering on first run), caches joined programs in serendb, ingests contacts from a pasted list or from Gmail/Outlook address books, drafts a pitch once per run via seren-models for operator approval, sends approved copy through Gmail (preferred) or Microsoft Outlook, enforces per-program dedupe plus a global unsubscribe list, and reports local plus live conversion and commission stats from seren-affiliates.
development
Family office: Process an incoming GP capital call notice end-to-end — confirm, fund, log, reconcile.
development
Work with Seren Bounty affiliate bounties: customers create and fund verifier-backed bounties; agents join to receive a referral_code and accrue earnings as qualifying events are verified; a release sweep pays matured earnings out of escrow.