DRY_RUN=true, use a dedicated wallet with a small amount, and watch the first live entry. Not financial advice.Scans every active v3/v4 pool on-chain, ranks by fee-APR, TVL & volume — no paid API.
Checks each token via Blockscout — holders, verification, concentration — before touching it.
Deposits only WETH as a resting bid — no swap, no slippage, no stuck tokens.
Stop-loss, trailing take-profit, fee collection & rule-based exits every cycle.
Logs every decision with a rationale, plus transaction history & realized PnL.
After ≥5 closed positions she evolves her screening thresholds from real win-rate.
Two scheduled cycles reason over live state with an LLM, then act deterministically.
| cycle | default | what it does |
|---|---|---|
| Screening | 30 min | discover pools → TVL/APR → filter → audit → maybe open a position. |
| Management | 15 min | value positions → stop-loss / take-profit / collect fees → close on triggers. |
The entry is single-sided. For a WETH pool she deposits only WETH in a range just off the current price — a resting bid. No swap happens, so there's no swap slippage and no failed-mint-after-swap loss. If it never fills you keep 100% of your WETH; it earns fees and accumulates the base token only as price dips into the range. Entry size is fixed by entrySizeEth and hard-capped in code.
git clone https://github.com/vaniarh337/vania-agent.git
cd vania-agent && npm install
cp .env.example .env.env set OPENROUTER_API_KEY and keep DRY_RUN=true. Tune the strategy in user-config.json.npm run verify # check contract addresses
npm start # → http://localhost:8787PRIVATE_KEY, flip DRY_RUN=false, watch the first entry. Deploy 24/7 on Railway from GitHub (see the README).All knobs live in user-config.json. A few you'll reach for:
| key | meaning |
|---|---|
management.entrySizeEth | ETH committed per position (auto-sized & hard-capped). |
management.maxOpenPositions | how many positions at once. |
management.stopLossPct / trailingTakeProfitPct | exit rules. |
screening.minFeeAprPct / minTvlUsd | how picky the screener is. |
cron.* | cycle intervals. |
llm.model | OpenRouter model (default: a cheap Haiku). |