Install
openclaw skills install setup-dcaSet up a non-custodial dollar-cost averaging strategy on Uniswap. Use when user wants to create recurring swaps, auto-buy ETH/BTC/SOL with USDC on a schedule, or build a DCA bot. Covers USDC approval, swap path selection, frequency configuration, Gelato keeper automation, and monitoring. Works on local testnet for development or mainnet for production.
openclaw skills install setup-dcaSets up a complete non-custodial dollar-cost averaging strategy on Uniswap. Instead of manually executing swaps on a schedule, remembering to check prices, finding optimal routes, and managing approvals, this skill configures the entire DCA lifecycle in one command: validates the strategy, selects the best swap path, configures execution frequency, handles Permit2 approvals, executes the first swap, and sets up ongoing automation.
Why this is 10x better than doing it manually:
Activate when the user says anything like:
Do NOT use when the user wants a one-time swap (use execute-swap instead), wants to manage an existing DCA (not yet supported -- cancel and recreate), or wants to DCA into LP positions (use full-lp-workflow instead).
| Parameter | Required | Default | How to Extract |
|---|---|---|---|
| targetAsset | Yes | -- | Token to accumulate: "ETH", "WBTC", "UNI", "SOL", or 0x address |
| amountPerExecution | Yes | -- | Amount per swap: "$100", "100 USDC", "0.1 ETH worth" |
| inputToken | No | USDC | Token to spend: "USDC", "USDT", "DAI", "WETH" |
| frequency | No | weekly | "daily", "weekly", "biweekly", "monthly" |
| totalExecutions | No | -- | Number of executions: "52 weeks", "12 months", "indefinite" |
| chain | No | ethereum | Target chain: "ethereum", "base", "arbitrum" |
| slippageTolerance | No | 50 (0.5%) | Max slippage in basis points per execution |
| keeperMode | No | self-execute | "self-execute" (agent-triggered) or "gelato" (on-chain keeper automation) |
| startImmediately | No | true | Whether to execute the first swap now |
If the user doesn't provide amountPerExecution or targetAsset, ask for them -- never guess a DCA strategy.
DCA SETUP PIPELINE
┌──────────────────────────────────────────────────────────────────────┐
│ │
│ Step 1: VALIDATE & ANALYZE │
│ ├── Check wallet balance (enough for at least 3 executions) │
│ ├── Verify target asset exists on chain │
│ ├── Get current price of target asset │
│ └── Output: Balance check + current price baseline │
│ │ │
│ ▼ │
│ │
│ Step 2: FIND OPTIMAL SWAP PATH │
│ ├── Discover all pools for inputToken/targetAsset │
│ ├── Get quotes across fee tiers at DCA amount │
│ ├── Select path with lowest price impact at execution size │
│ └── Output: Best route + expected slippage per execution │
│ │ │
│ ▼ │
│ │
│ Step 3: COST PROJECTION │
│ ├── Estimate gas cost per execution │
│ ├── Calculate total cost over full DCA period │
│ ├── Project keeper fees (if Gelato mode) │
│ ├── Compare DCA vs lump-sum at current price │
│ └── Output: Full cost breakdown + projection │
│ │ │
│ ▼ │
│ │
│ Step 4: USER CONFIRMATION │
│ ├── Present: strategy summary + cost projection │
│ ├── Ask: "Proceed with this DCA strategy?" │
│ └── User must explicitly confirm │
│ │ │
│ ▼ │
│ │
│ Step 5: CONFIGURE & EXECUTE │
│ ├── Check/set Permit2 approval for inputToken │
│ ├── If startImmediately: execute first swap via trade-executor │
│ ├── If gelato: create Gelato task with resolver + fund keeper │
│ ├── If self-execute: write DCA config to .uniswap/dca-config.json │
│ └── Output: Configuration + first execution result │
│ │ │
│ ▼ │
│ │
│ Step 6: MONITORING SETUP │
│ ├── Record baseline: price, balance, execution count │
│ ├── Set up execution tracking │
│ └── Output: DCA dashboard with next execution time │
│ │
└──────────────────────────────────────────────────────────────────────┘
Check prerequisites before committing to a strategy:
mcp__uniswap__get_agent_balance to verify the wallet has sufficient inputToken balance for at least 3 executions (safety buffer).mcp__uniswap__get_token_price for the targetAsset to establish a price baseline.mcp__uniswap__check_safety_status to verify spending limits can accommodate the DCA.Present to user:
Step 1/6: Validation
Wallet Balance: 5,200 USDC on Ethereum
DCA Budget: $100/week x 52 weeks = $5,200 total
Balance Check: PASS (covers full DCA period)
Target Asset: ETH at $1,960.00
Per Execution: ~0.051 ETH per $100
Proceeding to path selection...
Gate check: If the wallet balance covers fewer than 3 executions, warn the user and ask if they want to proceed with a shorter DCA period.
mcp__uniswap__get_pools_by_token_pair for inputToken/targetAsset on the target chain.mcp__uniswap__get_quote at the amountPerExecution size for the top 2-3 pools to compare price impact.Present to user:
Step 2/6: Path Selection
Best Route: USDC -> WETH via 0.05% pool (V3, Ethereum)
Pool TVL: $285M
Impact: ~0.01% per $100 execution
Alternative: 0.3% pool (0.02% impact -- slightly worse)
Proceeding to cost projection...
Calculate the full cost of the DCA strategy:
Step 3/6: Cost Projection
DCA Strategy: $100 USDC -> ETH weekly for 52 weeks
Per Execution:
Swap Amount: $100.00
Est. Slippage: ~$0.01 (0.01%)
Gas Cost: ~$2.50 (at current gas)
Net Purchase: ~$97.49 of ETH
Full Period (52 weeks):
Total Spent: $5,200.00
Est. Gas: ~$130.00 (2.5%)
Est. Slippage: ~$0.52 (0.01%)
Net Invested: ~$5,069.48
At Current Price ($1,960/ETH):
Lump Sum Now: 2.653 ETH for $5,200
DCA Estimate: ~2.587 ETH (varies with price)
Ready for your confirmation...
Present the full strategy summary and ask for explicit confirmation:
DCA Strategy Confirmation
Buy: ETH with USDC
Amount: $100 per execution
Frequency: Weekly (every 7 days)
Duration: 52 executions
Chain: Ethereum
Route: USDC/WETH 0.05% (V3)
Slippage: 0.5% max
Mode: Self-execute (agent-triggered)
Start: Immediately (first swap now)
Total Cost: ~$5,200 + ~$130 gas
Proceed with this DCA strategy? (yes/no)
Only proceed to Step 5 if the user explicitly confirms.
Delegate the first execution to Task(subagent_type:trade-executor):
Execute this swap as the first DCA execution:
- Sell: {amountPerExecution} {inputToken}
- Buy: {targetAsset}
- Chain: {chain}
- Slippage tolerance: {slippageTolerance} bps
- Context: This is execution 1 of {totalExecutions} in a DCA strategy.
Route through the {fee}% pool for optimal execution at this size.
After execution, write the DCA configuration:
For self-execute mode, write .uniswap/dca-config.json:
{
"strategy": "dca",
"inputToken": "USDC",
"targetAsset": "WETH",
"amountPerExecution": "100000000",
"frequency": "weekly",
"nextExecution": "2026-02-17T00:00:00Z",
"totalExecutions": 52,
"completedExecutions": 1,
"chain": "ethereum",
"chainId": 1,
"route": {
"pool": "0x...",
"fee": 500,
"version": "v3"
},
"slippageTolerance": 50,
"status": "active",
"createdAt": "2026-02-10T00:00:00Z",
"executionHistory": []
}
For Gelato mode, create a Gelato Automate task with:
block.timestamp >= nextExecutionStep 6/6: DCA Active
First Execution:
Sold: 100 USDC
Received: 0.0510 WETH ($99.96)
Gas: $2.30
Tx: https://etherscan.io/tx/0x...
Schedule:
Next: 2026-02-17 (7 days)
Remaining: 51 executions
Mode: Self-execute
Config: .uniswap/dca-config.json
DCA Strategy Active
Strategy:
Buy: ETH with USDC
Amount: $100 per execution
Frequency: Weekly
Duration: 52 executions (~1 year)
Chain: Ethereum
Route: USDC/WETH 0.05% (V3)
Mode: Self-execute
First Execution:
Sold: 100 USDC
Received: 0.0510 WETH ($99.96)
Slippage: 0.04%
Gas: $2.30
Tx: https://etherscan.io/tx/0x...
Projections:
Total Budget: $5,200 + ~$130 gas
Est. ETH: ~2.59 ETH (at current prices)
Next Execution: 2026-02-17
Config: .uniswap/dca-config.json
Status: ACTIVE -- 1/52 executions complete
DCA Strategy Configured (Not Started)
Strategy:
Buy: ETH with USDC
Amount: $100 per execution
Frequency: Weekly
Chain: Ethereum
Route: USDC/WETH 0.05% (V3)
Mode: Self-execute
First Execution: 2026-02-17 (scheduled)
Config: .uniswap/dca-config.json
Status: CONFIGURED -- awaiting first execution
.uniswap/dca-config.json file tracks execution history, next execution time, and strategy parameters. Deleting it effectively cancels the DCA.status to "cancelled". For Gelato mode, the Gelato task must also be cancelled on-chain.| Error | User-Facing Message | Suggested Action |
|---|---|---|
| Insufficient balance | "Wallet has {X} {inputToken} but DCA needs at least {Y} for 3 executions." | Fund wallet or reduce amount per execution |
| Target asset not found | "Could not find {targetAsset} on {chain}." | Check spelling or provide contract address |
| No pools found | "No Uniswap pools found for {inputToken}/{targetAsset} on {chain}." | Try a different chain or token pair |
| Gas too high | "Gas cost (~${X}) exceeds 5% of execution amount (${Y}). Consider using Base." | Switch to an L2 chain for cheaper execution |
| Safety check failed | "Safety limits would be exceeded by this DCA strategy." | Adjust spending limits or reduce DCA amount |
| Approval failed | "Could not approve {inputToken} for Permit2: {reason}." | Check wallet permissions and retry |
| First execution failed | "First DCA execution failed: {reason}. Strategy configured but not started." | Fix the issue and manually trigger first execution |
| Gelato setup failed | "Could not create Gelato automation task: {reason}." | Use self-execute mode instead |
| Config write failed | "Could not write DCA configuration: {reason}." | Check file permissions |
| Wallet not configured | "No wallet configured. Cannot execute DCA." | Set up wallet with setup-agent-wallet |
| Spending limit exceeded | "DCA total (${X}) exceeds daily spending limit (${Y})." | Adjust spending limits or reduce DCA frequency/amount |