zest-borrow-asset-primitive
Zest Borrow Asset Primitive
What it does
zest-borrow-asset-primitive borrows a selected Zest V2-supported asset against an existing V2 collateral position on Stacks mainnet. It is a primitive write skill: one operator-selected amount, one Zest V2 borrow transaction, and proof-ready JSON output.
The skill is market-aware but not strategy-specific: callers choose --collateral-asset, --borrow-asset, and --amount, and the skill validates those choices against the live Zest registry before planning or broadcasting. It does not supply collateral, swap borrowed assets, run a leverage loop, repay debt, or unwind a position.
Why agents need it
Leveraged sBTC workflows need a proven borrow leg before any controller can safely compose borrow, swap, and re-supply steps. This skill isolates the debt-creating action so it can be reviewed, proved, and reused without hiding borrow risk inside a larger strategy.
Safety notes
- This is a write skill and can create debt.
- It requires existing Zest collateral before borrowing.
- It requires explicit
--confirm=BORROWbefore broadcast. - It verifies the configured Zest V2 market, vault, assets, and egroup contracts before a write.
- It reads selected asset, LP token, oracle, reserve, collateral, debt, gas, and pending transaction state before planning or running.
- It uses
PostConditionMode.Denywith an asset transfer postcondition for the borrowed asset where expressible. - For non-STX borrowed assets, the postcondition uses the SIP-010 asset name, not the contract name.
- It calls
v0-4-market.borrowdirectly; legacy helper contracts are not the submission target. - It treats
borrow-helper-v2-1-7andborrow-helper-v2-1-5as legacy/non-target paths for this V2 primitive. - It blocks when the sender has pending STX transactions.
- It checks the signer address against
--wallet. - It resolves the existing AIBTC wallet/runtime first and does not create or import a wallet.
- It does not hardcode proof wallets, amounts, or proof-only signer behavior.
Commands
doctor
Checks live Zest contract/interface readiness, wallet gas, pending transaction depth, and selected asset support. If asset flags are omitted, doctor uses a baseline supported-asset pair only for dependency readiness; that default pass does not prove readiness for every supported asset pair.
bun run zest-borrow-asset-primitive/zest-borrow-asset-primitive.ts doctor --wallet <stacks-address>
If doctor returns UNSUPPORTED_* for any dependency, stop. Re-verify the Zest contract identifier against live protocol sources or Hiro before planning a borrow.
status
Reads current collateral/debt state for the selected collateral and borrow assets.
Requires explicit --collateral-asset and --borrow-asset; strategy commands do not infer the market from defaults.
bun run zest-borrow-asset-primitive/zest-borrow-asset-primitive.ts status --wallet <stacks-address> --collateral-asset sBTC --borrow-asset STX
plan
Builds a read-only borrow preview, including contract arguments, postcondition plan, pending depth, current position data, and proof obligations.
Requires explicit --collateral-asset, --borrow-asset, and --amount.
bun run zest-borrow-asset-primitive/zest-borrow-asset-primitive.ts plan --wallet <stacks-address> --collateral-asset sBTC --borrow-asset STX --amount <base-units>
--amount is always in base units for the selected borrow asset. STX is accepted as an operator-facing alias for Zest wSTX, and other supported assets use their live registry token, asset name, LP token, oracle, and decimals.
run
Rechecks live state, resolves a signer, broadcasts only after explicit confirmation, and returns proof JSON.
Requires explicit --collateral-asset, --borrow-asset, --amount, and --confirm=BORROW.
bun run zest-borrow-asset-primitive/zest-borrow-asset-primitive.ts run --wallet <stacks-address> --collateral-asset sBTC --borrow-asset STX --amount <base-units> --confirm=BORROW
Without --confirm=BORROW, run refuses before signer resolution or transaction construction.
Output contract
All commands print one JSON object to stdout with this envelope:
{ "status": "success|blocked|error", "action": "doctor|status|plan|run", "data": {}, "error": null }
Success:
{ "status": "success", "action": "plan", "data": {}, "error": null }
Blocked:
{
"status": "blocked",
"action": "run",
"data": {},
"error": {
"code": "CONFIRMATION_REQUIRED",
"message": "This write skill requires explicit confirmation.",
"next": "Re-run with --confirm=BORROW."
}
}
Error:
{ "status": "error", "action": "run", "data": {}, "error": { "code": "ERROR", "message": "...", "next": "Inspect the error and rerun doctor." } }
Known constraints
- Mainnet only.
- The first proof collateral path is sBTC collateral and the first proof borrow path is STX, but both are selected through runtime CLI inputs.
STXis treated as the Zest wrapped STX asset (wSTX) for the borrow contract.- This skill only borrows; it does not enable collateral, supply collateral, swap, repay, or rebalance.
- The verified V2 borrow target is
SP1A27KFY4XERQCCRCARCYD1CC5N7M6688BSYADJ7.v0-4-market.borrow. - The V2 borrow ABI is positional:
ft,amount,receiver,price-feeds;receivermust be an optional principal such as(some --wallet). - Zest's exact global health calculation is enforced inside the V2 market borrow path. The skill reads public Zest state and refuses obvious unsafe setups, but PR proof must include successful on-chain execution and post-borrow status showing updated debt before any leverage controller can depend on it.
scaledDebtis index-scaled principal, not the exact repayment amount. Status output includes debt-index fields and estimated current debt when the borrow vault exposes them.- Some Zest V2 assets intentionally share a base oracle feed and apply a Market callcode transform. Status output includes the live registry oracle tuple so downstream controllers can see the feed id and callcode used by the selected collateral and borrow assets.
- Single-borrow nonce safety is in scope: the skill blocks when the sender already has pending STX transactions. Standalone/cross-skill nonce serialization belongs in the existing nonce runtime primitives and later composed controllers.
Origin
Winner of AIBTC x Bitflow Skills Pay the Bills competition. Original author: @macbotmini-eng Competition PR: https://github.com/BitflowFinance/bff-skills/pull/572
More from aibtcdev/skills
arxiv-research
Fetch and compile arXiv papers on LLMs, autonomous agents, and AI infrastructure into scored, grouped research digests. Stores digests at ~/.aibtc/arxiv-research/digests/. No API key required.
180aibtc-news
aibtc.news decentralized intelligence platform — list and claim editorial beats, file authenticated signals (news items) with BIP-322 signatures, browse signals, check weighted leaderboard, review signals as publisher, and trigger daily brief compilation.
168aibtc-news-correspondent
Correspondent for aibtc.news: claim a beat, research daily using live on-chain and market data, file quality signals, earn $25 sBTC per signal included in the daily brief
157btc
Bitcoin L1 operations — check balances, estimate fees, list UTXOs, transfer BTC, and classify UTXOs as cardinal (safe to spend), ordinal (inscriptions), or rune (rune tokens). Data sourced from mempool.space and the Unisat API.
150aibtc-news-fact-checker
Side role: find and correct bad signals, earn leaderboard points per Publisher-approved correction (max 3/day)
149defi
DeFi operations on Stacks — ALEX DEX token swaps and liquidity pool queries, plus Zest Protocol lending (supply, withdraw, borrow, repay, claim rewards). All operations are mainnet-only. Write operations require an unlocked wallet.
148