Lista Lending Skill (POC)
Status: Pre-release (internal only, not in public registry) Agent quick check:
node dist/cli/cli.bundle.mjs versionAgent rebuild:npm install && npm run build
Execute Lista Lending vault and market operations through @lista-dao/moolah-lending-sdk, with transaction sending delegated to lista-wallet-connect.
Agent Execution Policy
- Execute CLI/setup commands directly as the agent; do not ask the user to run shell commands.
- If dependencies/build are missing or outdated, run setup/build automatically.
- Before any signing or on-chain write action, explain the action and get user consent.
- Do not output raw JSON/internal payloads to users by default; convert results into human-readable summaries/tables.
- Use command snippets in this document as agent-side execution references only.
When to Use This Skill
This skill handles LENDING-SPECIFIC viewing and operations.
✅ Use when user wants to:
1. View LENDING positions only:
- "Check my lending positions"
- "Show my Lista vaults"
- "What's in my lending markets"
- "My collateral in lending vaults"
2. Execute lending operations:
- "Deposit 100 USDT to Lista vault"
- "Withdraw from my Lista vault"
- "Borrow against my collateral"
- "Repay my lending debt"
- "Find best lending yield"
❌ Do NOT use for:
- All-product/report-style overview → Use
lista - "Check ALL my Lista positions" (report view) → Use
lista - "My total Lista collateral/debt" (summary-style answer) → Use
lista
Key difference:
lista: VIEW report-style lending analytics and summarieslista-lending: VIEW/OPERATE lending only (vaults + markets)lista-wallet-connect: Wallet operations (connect/sign/call)
Routing Priority (Required)
Apply these routing rules before running commands:
- Wallet/session/signing issues (
pair,auth,sign,topic,session) →lista-wallet-connect - Lending write operations (
deposit,withdraw,supply,borrow,repay,market-withdraw) →lista-lending - Lending actionable reads (
holdings,vaults,marketsfor selection/filtering/follow-up execution) →lista-lending - Report/narrative analysis (
position report,risk check,daily digest, high-level market/vault summary) →lista
Ambiguous intent handling:
check my positions: if user asks for operation follow-up or lending-only detail, uselista-lending; otherwise uselista.market list/vault list: if user needs execution target selection, uselista-lending; if user only wants macro overview, uselista.
Scope
Supported capabilities:
- Vault:
vaults,select --vault,deposit,withdraw - Market:
markets,select --market,supply,borrow,repay,market-withdraw - Portfolio:
holdings - Runtime/config:
config,version
Not in scope:
- CDP operations
- Non-EVM chains
Temporary Limitations
Current unsupported market types for trade actions (select/supply/borrow/repay/market-withdraw):
- SmartLending markets (
zone === 3) - Fixed-term markets (
termType === 1)
Behavior:
marketscommand filters them out from list output.select --marketrejects them withunsupported_market_type.holdingsstill returns them (for full portfolio visibility) and marks:isSmartLendingisFixedTermisActionable
Project Structure
skills/lista-lending/
├── SKILL.md
├── package.json
├── tsconfig.json
└── src/
├── cli/ # args/help/meta/run
├── api/ # vault/market/user read-side queries
├── sdk/ # SDK client + market runtime prefetch
├── executor/ # tx execution + receipt polling
├── commands/ # command handlers
│ ├── shared/ # context/errors/output/tx helpers
│ ├── select/
│ ├── borrow/
│ └── repay/
├── presenters/
├── utils/
├── config.ts
├── context.ts
├── api.ts # API facade export
├── sdk.ts # SDK facade export
├── executor.ts # executor facade export
└── cli.ts # CLI entrypoint
Notes:
- CLI parsing/routing lives in
src/cli/*and keepssrc/cli.tsas the single entrypoint. - Read-side querying is split by domain in
src/api/*(vault,market,user). - SDK integration is centralized in
src/sdk/client.ts; market runtime prefetch is insrc/sdk/market-runtime.ts. borrowandrepayare split into dedicatedsimulateandexecutemodules to keep command files small.
Prerequisites
- Wallet is paired via
lista-wallet-connectskill. - You have a valid
wallet-topicandwallet-address. - Node.js version is
>= 18.0.0(recommended>= 20). lista-wallet-connectis built (skills/lista-wallet-connect/dist/cli/cli.bundle.mjsexists).lista-lendingis built (skills/lista-lending/dist/cli/cli.bundle.mjsexists).
Setup (Agent-Run)
Use prebuilt dist/ by default for faster startup.
cd skills/lista-lending
# ensure Node.js >= 18 (recommended >= 20)
node -v
node dist/cli/cli.bundle.mjs version
Only run install/build when dist/ is missing or version check fails:
cd skills/lista-lending
npm install
npm run build
node dist/cli/cli.bundle.mjs version
Fallback for local debugging (non-bundled output):
cd skills/lista-lending
npm run build
node dist/cli.js version
If skills/lista-wallet-connect/dist/cli/cli.bundle.mjs is missing, rebuild wallet-connect as well:
cd skills/lista-wallet-connect
npm install
npm run build
Agent execution path:
cd skills/lista-lending
node dist/cli/cli.bundle.mjs <command> [options]
Output Contract
stdout: machine-readable JSON (result payload)stderr: errors only- Optional debug mode: add
--debug-log-file <path>to append structuredstdout/stderrlogs (jsonl).
Agent Display Guidelines
For user-facing answers, keep CLI JSON as internal source of truth, then render human-readable tables/summaries. Return raw JSON only when the user explicitly asks for raw output.
vaults recommended columns:
Vault,Asset,TVL (USD),APY,Curator
markets recommended columns:
Collateral,Loan,LLTV,Borrow Rate,Liquidity (USD)
holdings recommended structure:
- Summary block first: total vault count, total market count, actionable market count, unsupported market count.
- Vault table columns:
Vault,Chain,Deposited,Deposited USD,APY,Wallet Balance
- Actionable market table columns:
Market,Chain,Collateral USD,Borrowed USD,LTV,Health
- Unsupported market table columns (non-technical by default):
Market,Chain,Reason,Collateral USD,Borrowed USD
Default rule:
- Use different table layouts for different commands (
vaults,markets,holdings); do not reuse holdings layout for vault/market list pages. - Keep CLI/runtime JSON and debug logs in raw format (for example
eip155:56,eip155:1) for stable machine parsing and debugging. - For user-facing text/tables, map chain IDs to names (
eip155:1->Ethereum,eip155:56->BSC). - Do not show
zone/termTypein user-facing table unless user explicitly asks for technical details. - Do not paste full raw payloads (JSON/RPC internals) in normal user-facing replies.
- Derive
Reasonfrom flags:isSmartLending => SmartLendingisFixedTerm => Fixed-term
Health definition (for market positions):
- Formula:
health = LLTV / LTVwhenLTV > 0; otherwisehealth = 100. - Display label suggestion:
Healthy:health >= 1.2Warning:1.0 <= health < 1.2Risk:health < 1.0
- Action hint: if label is
WarningorRisk, suggest repay/reduce borrow.
Supported Chains
eip155:56(BSC, default)eip155:1(Ethereum)
Command Index
version- show skill version and compatibility hintsconfig- read/update RPC settingsvaults- list vaults with filtersmarkets- list markets with filters (SmartLending/fixed-term filtered)holdings- query user positions across vault + marketselect- set active vault or market contextdeposit- deposit to selected/explicit vaultwithdraw- withdraw from selected/explicit vaultsupply- supply collateral to selected/explicit marketborrow- simulate or execute borrowrepay- simulate or execute repaymarket-withdraw- withdraw supplied collateral from selected/explicit market
Global/Shared Options
--chain <eip155:56|eip155:1>--wallet-topic <topic>--wallet-address <0x...>
Command Details
All command snippets below are for agent execution; do not instruct the user to type them manually.
1) version
Purpose: Print skill version and dependency constraints.
node dist/cli/cli.bundle.mjs version
2) config
Purpose: Manage RPC override.
Examples:
# show config
node dist/cli/cli.bundle.mjs config --show
# set rpc override
node dist/cli/cli.bundle.mjs config --set-rpc --chain eip155:56 --url https://bsc-mainnet.nodereal.io/v1/<key>
# clear rpc override
node dist/cli/cli.bundle.mjs config --clear-rpc --chain eip155:56
Notes:
- Config file:
~/.agent-wallet/lending-config.json - Chain fallback RPCs are still used if primary RPC fails.
3) vaults
Purpose: Discover vaults from SDK list API.
Common options:
--page,--page-size,--sort,--order--zone,--keyword--assets <a,b>,--curators <a,b>
Examples:
node dist/cli/cli.bundle.mjs vaults
node dist/cli/cli.bundle.mjs vaults --chain eip155:1
node dist/cli/cli.bundle.mjs vaults --sort apy --order desc --page 1 --page-size 10
node dist/cli/cli.bundle.mjs vaults --assets 0x8d0d...,0x55d3... --curators "Lista DAO,Pangolins"
4) markets
Purpose: Discover markets from SDK list API.
Common options:
--page,--page-size,--sort,--order--zone,--keyword--loans <a,b>,--collaterals <a,b>
Examples:
node dist/cli/cli.bundle.mjs markets
node dist/cli/cli.bundle.mjs markets --chain eip155:56 --sort liquidity --order desc --page-size 20
node dist/cli/cli.bundle.mjs markets --loans USD1,USDT --collaterals USD1,BTCB
Notes:
- Command filters out SmartLending (
zone=3) and fixed-term (termType=1) markets in output. - Always include this user-facing note when presenting market list:
Smart Lending and fixed-term market operations are currently not supported in this skill. For full functionality, please use the Lista website.
5) holdings
Purpose: Query positions by wallet address.
Options:
--address <0x...>(optional if context already hasuserAddress)--scope <all|vault|market|selected>
Examples:
# all positions (vault + market)
node dist/cli/cli.bundle.mjs holdings --address 0xYOUR_ADDRESS
# only vault positions
node dist/cli/cli.bundle.mjs holdings --address 0xYOUR_ADDRESS --scope vault
# only market positions
node dist/cli/cli.bundle.mjs holdings --address 0xYOUR_ADDRESS --scope market
# only currently selected position
node dist/cli/cli.bundle.mjs holdings --scope selected
Market position fields include:
- User-facing fields:
isSmartLending(zone === 3)isFixedTerm(termType === 1)isActionable(!isSmartLending && !isFixedTerm)
- Raw JSON technical fields (debug/integration only):
zone,termType
6) select
Purpose: Persist active target in context for follow-up operations.
Modes:
- select vault:
--vault - select market:
--market - read context:
--show - clear context:
--clear
Examples:
# select vault
node dist/cli/cli.bundle.mjs select \
--vault 0xfa27f172e0b6ebcef9c51abf817e2cb142fbe627 \
--chain eip155:56 \
--wallet-topic <topic> \
--wallet-address 0xYOUR_ADDRESS
# select market
node dist/cli/cli.bundle.mjs select \
--market 0xd384584abf6504425c9873f34a63372625d46cd1f2e79aeedc77475cacaca922 \
--chain eip155:56 \
--wallet-topic <topic> \
--wallet-address 0xYOUR_ADDRESS
# show/clear
node dist/cli/cli.bundle.mjs select --show
node dist/cli/cli.bundle.mjs select --clear
Notes:
- Market selection rejects SmartLending and fixed-term markets.
- Context file:
~/.agent-wallet/lending-context.json
7) deposit
Purpose: Deposit vault asset.
Required:
--amount- plus either selected vault context or explicit
--vault+ wallet info
Example:
# using selected vault
node dist/cli/cli.bundle.mjs deposit --amount 1
# explicit target
node dist/cli/cli.bundle.mjs deposit \
--vault 0xVAULT \
--amount 1 \
--chain eip155:56 \
--wallet-topic <topic> \
--wallet-address 0xYOUR_ADDRESS
8) withdraw
Purpose: Withdraw vault asset.
Required:
- one of
--amountor--withdraw-all
Examples:
node dist/cli/cli.bundle.mjs withdraw --amount 0.5
node dist/cli/cli.bundle.mjs withdraw --withdraw-all
9) supply
Purpose: Supply market collateral.
Required:
--amount- plus selected market context or explicit market/wallet parameters
Example:
node dist/cli/cli.bundle.mjs supply --amount 2
10) borrow
Purpose: Borrow loan token, or simulate borrow capacity.
Modes:
- simulate only:
--simulate - simulate with hypothetical supply:
--simulate --simulate-supply <amt> - execute borrow:
--amount <amt>
Examples:
# check max borrowable
node dist/cli/cli.bundle.mjs borrow --simulate
# check max after hypothetical supply
node dist/cli/cli.bundle.mjs borrow --simulate --simulate-supply 2
# execute borrow
node dist/cli/cli.bundle.mjs borrow --amount 0.01
11) repay
Purpose: Repay market debt, or simulate repay impact.
Modes:
- simulate repay amount:
--simulate --amount <amt> - simulate repay-all:
--simulate --repay-all - execute repay:
--amount <amt>or--repay-all
Examples:
# simulate partial repay impact
node dist/cli/cli.bundle.mjs repay --simulate --amount 0.01
# simulate full repay impact
node dist/cli/cli.bundle.mjs repay --simulate --repay-all
# execute
node dist/cli/cli.bundle.mjs repay --amount 0.01
node dist/cli/cli.bundle.mjs repay --repay-all
12) market-withdraw
Purpose: Withdraw market collateral.
Required:
- one of
--amountor--withdraw-all
Examples:
node dist/cli/cli.bundle.mjs market-withdraw --amount 0.5
node dist/cli/cli.bundle.mjs market-withdraw --withdraw-all
Transaction Behavior
- Transactions are built by SDK and executed through
lista-wallet-connectcallcommand. callperforms simulation by default before requesting wallet signature.- If simulation fails, result is returned as error/reverted and no signing request is sent.
- If user rejects in wallet, command returns
status: "rejected", reason: "user_rejected". - For multi-step operations (approve + action), responses include completed step count and failed/pending step.
Typical Workflows
Vault flow
# 1) discover
node dist/cli/cli.bundle.mjs vaults --chain eip155:56
# 2) select
node dist/cli/cli.bundle.mjs select --vault 0xVAULT --wallet-topic <topic> --wallet-address 0xADDR
# 3) operate
node dist/cli/cli.bundle.mjs deposit --amount 1
node dist/cli/cli.bundle.mjs withdraw --amount 0.5
Market flow
# 1) discover
node dist/cli/cli.bundle.mjs markets --chain eip155:56
# 2) select
node dist/cli/cli.bundle.mjs select --market 0xMARKET --wallet-topic <topic> --wallet-address 0xADDR
# 3) operate
node dist/cli/cli.bundle.mjs supply --amount 2
node dist/cli/cli.bundle.mjs borrow --simulate
node dist/cli/cli.bundle.mjs borrow --amount 0.01
node dist/cli/cli.bundle.mjs repay --simulate --amount 0.01
node dist/cli/cli.bundle.mjs repay --amount 0.01
node dist/cli/cli.bundle.mjs market-withdraw --amount 1
Security Checklist
- Confirm token symbol and amount with user before any state-changing action.
- Confirm chain (
eip155:56vseip155:1) before sending tx. - Prefer
borrow --simulatebefore first borrow on a market. - Treat
user_rejectedas normal user decision, not protocol failure.