defi-skills

April 19, 2026 · View on GitHub

License: MIT Python 3.10+ Chains: 6 Protocols: 14 Actions: 54

Translate natural language into unsigned DeFi transaction payloads. A data-driven playbook engine resolves human-readable parameters (token symbols, ENS names, decimal amounts) into ABI-encoded calldata, with zero protocol-specific code in the engine.

Give your agent DeFi superpowers

Claude Code:

/plugin marketplace add NethermindEth/defi-skills
/plugin install defi-skills@nethermind-defi-skills

OpenClaw:

npx clawhub install defi-skills

That's it. Your agent can now build DeFi transactions:

"Supply 100 USDC to Aave" · "Swap 0.5 ETH for USDC on Uniswap" · "Stake 5 ETH on Lido"

https://github.com/user-attachments/assets/cdc2fd63-b007-40a4-900e-a6f775b6e9fa

Install

pip install defi-skills

Or from source:

git clone https://github.com/NethermindEth/defi-skills
cd defi-skills
python3 -m venv .venv && source .venv/bin/activate
pip install -e .

Quick Start

defi-skills config setup                  # interactive wizard
defi-skills actions                       # list all actions
defi-skills actions --chain-id 11155111   # list Sepolia actions

Build unsigned transactions (fully deterministic, no LLM requierd):

# Mainnet
defi-skills build --action aave_supply --args '{"asset":"USDC","amount":"500"}' --json

# Sepolia
defi-skills build --action aave_supply --args '{"asset":"WETH","amount":"1"}' --chain-id 11155111 --json

# More examples
defi-skills build --action uniswap_swap --args '{"asset_in":"WETH","asset_out":"USDC","amount":"0.5"}' --json
defi-skills build --action lido_stake --args '{"amount":"5"}' --json
defi-skills build --action weth_wrap --args '{"amount":"2"}' --json

Interactive chat mode (requires LLM API key):

defi-skills chat

Output

{
  "success": true,
  "transactions": [
    {
      "type": "approval",
      "raw_tx": { "chain_id": 1, "to": "0xA0b8...", "value": "0", "data": "0x095ea7b3..." }
    },
    {
      "type": "action",
      "action": "aave_supply",
      "function_name": "supply",
      "raw_tx": { "chain_id": 1, "to": "0x8787...", "value": "0", "data": "0x617ba037..." }
    }
  ]
}

Each raw_tx contains {chain_id, to, value, data} -- everything needed to sign and broadcast. The tool never signs or broadcasts. Gas estimation and nonce management are left to the signing wallet.

Supported Protocols

ProtocolChainsActions
Native ETHAlltransfer_native
ERC-20Alltransfer_erc20
ERC-721Alltransfer_erc721
WETHMainnet, Arbitrum, Base, Optimism, Sepoliaweth_wrap, weth_unwrap
Aave V3Mainnet, Arbitrum, Base, Optimism, Polygon, Sepoliaaave_supply, aave_withdraw, aave_borrow, aave_repay, aave_set_collateral, aave_repay_with_atokens, aave_claim_rewards
Uniswap V3Mainnet, Arbitrum, Base, Optimism, Polygon, Sepoliauniswap_swap, uniswap_lp_mint, uniswap_lp_collect, uniswap_lp_decrease, uniswap_lp_increase
Compound V3Mainnet, Arbitrum, Base, Optimism, Polygoncompound_supply, compound_withdraw, compound_borrow, compound_repay, compound_claim_rewards
Balancer V2Mainnet, Arbitrum, Base, Optimism, Polygonbalancer_swap, balancer_join_pool, balancer_exit_pool
LidoMainnetlido_stake, lido_wrap_steth, lido_unwrap_wsteth, lido_unstake, lido_claim_withdrawals
CurveMainnetcurve_add_liquidity, curve_remove_liquidity, curve_gauge_deposit, curve_gauge_withdraw, curve_mint_crv
MakerDAO DSRMainnetmaker_deposit, maker_redeem
Rocket PoolMainnetrocketpool_stake, rocketpool_unstake
EigenLayerMainneteigenlayer_deposit, eigenlayer_delegate, eigenlayer_undelegate, eigenlayer_queue_withdrawals, eigenlayer_complete_withdrawal
Pendle V2Mainnetpendle_swap_token_for_pt, pendle_swap_pt_for_token, pendle_swap_token_for_yt, pendle_swap_yt_for_token, pendle_add_liquidity, pendle_remove_liquidity, pendle_mint_py, pendle_redeem_py, pendle_claim_rewards
FibrousBasefibrous_swap

How It Works

Architecture Diagram

The engine has two modes: build (deterministic, no LLM) and chat (interactive LLM agent on top). Both use the same pipeline:

  1. Playbooks -- JSON files define each protocol's actions, parameters, and ABI mappings. Chain-agnostic: no hardcoded addresses.
  2. ChainResources -- Per-chain contract addresses in data/chains/{chain_id}/{protocol}.json. Supports action overrides (different ABIs) and token overrides (different addresses) per chain.
  3. Resolvers -- Pure functions that transform human inputs (token symbols, ENS names, amounts) into on-chain values (addresses, wei, calldata).
  4. Encoder -- Maps resolved values to ABI parameters and produces the final {to, value, data}.

For the full component breakdown, see docs/architecture.md.

Adding a New Protocol

Use the Claude Code agent for the fastest path:

@playbook-generator Add Morpho protocol

Or generate manually:

python scripts/generate_playbook.py \
  --protocol morpho_blue \
  --contracts "pool=0xBBBB..." \
  --functions supply,withdraw,borrow,repay

See CONTRIBUTING.md for the full walkthrough, including multi-chain support and fork validation.

Configuration

defi-skills config setup   # interactive wizard

Key environment variables:

VariableRequired for
WALLET_ADDRESSAll commands
ALCHEMY_API_KEYOn-chain quotes, ENS, balance queries (enable all chains in your Alchemy dashboard)
ONEINCH_API_KEYToken discovery on L2s (Arbitrum, Base, Optimism, Polygon)
ANTHROPIC_API_KEYChat mode only

See docs/configuration.md for the full list.

Safety

  • Output is always unsigned. The tool never signs or broadcasts.
  • No private keys involved at any stage.
  • All addresses EIP-55 checksummed.
  • DEX operations include on-chain quoting with configurable slippage protection.
  • Resolvers raise errors on failure. Broken transactions are never silently produced.

Known Limitations

  • 6 chains: Mainnet, Arbitrum, Base, Optimism, Polygon, and Sepolia. Adding a protocol to an existing chain requires only data files. Adding a new chain also requires registering it in chains.py.
  • No gas estimation -- the signing wallet handles gas and nonce.
  • Single-hop swaps only on Uniswap and Balancer.
  • Static contract addresses -- protocol upgrades require manual updates to chain resource files.

Tests

pip install -e ".[dev]"
pytest tests/ -v   # fully offline, no API keys needed

Website: https://defi-skills.nethermind.io/ Telegram Group: https://t.me/defi_skills

License

MIT