Skip to main content

Multi-chain DeFi transaction builder — translates natural language into unsigned, ABI-encoded payloads across Ethereum, Arbitrum, Base, Optimism, Polygon, and Sepolia

Project description

defi-skills

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

Protocol Chains Actions
Native ETH All transfer_native
ERC-20 All transfer_erc20
ERC-721 All transfer_erc721
WETH Mainnet, Arbitrum, Base, Optimism, Sepolia weth_wrap, weth_unwrap
Aave V3 Mainnet, Arbitrum, Base, Optimism, Polygon, Sepolia aave_supply, aave_withdraw, aave_borrow, aave_repay, aave_set_collateral, aave_repay_with_atokens, aave_claim_rewards
Uniswap V3 Mainnet, Arbitrum, Base, Optimism, Polygon, Sepolia uniswap_swap, uniswap_lp_mint, uniswap_lp_collect, uniswap_lp_decrease, uniswap_lp_increase
Compound V3 Mainnet, Arbitrum, Base, Optimism, Polygon compound_supply, compound_withdraw, compound_borrow, compound_repay, compound_claim_rewards
Balancer V2 Mainnet, Arbitrum, Base, Optimism, Polygon balancer_swap, balancer_join_pool, balancer_exit_pool
Lido Mainnet lido_stake, lido_wrap_steth, lido_unwrap_wsteth, lido_unstake, lido_claim_withdrawals
Curve Mainnet curve_add_liquidity, curve_remove_liquidity, curve_gauge_deposit, curve_gauge_withdraw, curve_mint_crv
MakerDAO DSR Mainnet maker_deposit, maker_redeem
Rocket Pool Mainnet rocketpool_stake, rocketpool_unstake
EigenLayer Mainnet eigenlayer_deposit, eigenlayer_delegate, eigenlayer_undelegate, eigenlayer_queue_withdrawals, eigenlayer_complete_withdrawal
Pendle V2 Mainnet pendle_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
Fibrous Base fibrous_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:

Variable Required for
WALLET_ADDRESS All commands
ALCHEMY_API_KEY On-chain quotes, ENS, balance queries (enable all chains in your Alchemy dashboard)
ONEINCH_API_KEY Token discovery on L2s (Arbitrum, Base, Optimism, Polygon)
ANTHROPIC_API_KEY Chat 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

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

defi_skills-0.3.0.tar.gz (157.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

defi_skills-0.3.0-py3-none-any.whl (196.1 kB view details)

Uploaded Python 3

File details

Details for the file defi_skills-0.3.0.tar.gz.

File metadata

  • Download URL: defi_skills-0.3.0.tar.gz
  • Upload date:
  • Size: 157.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for defi_skills-0.3.0.tar.gz
Algorithm Hash digest
SHA256 4cd97ff27e5b8d5542b68654f362c5c0a2af6c87d6f56d0ef2f0095cfe934dd4
MD5 f9d9a00c59e6a57030197cc6065f48f2
BLAKE2b-256 6b0dcd2d2b4d734b41f6bfdf79a2188c8ffc9dd6d836bec85a18dbb849108d1d

See more details on using hashes here.

File details

Details for the file defi_skills-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: defi_skills-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 196.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for defi_skills-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bd4a5502c7a549109790a4f10d3688464688a52a5bbdd590c33e864b2902adc9
MD5 64420f3d75d3f1ba2d8a4c16e1848083
BLAKE2b-256 60d0c667a37497c13f8490f906dbe1e8062e161861728bab28ed87bf00ff1672

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page