Install
openclaw skills install @batcatchina/zhenghe-vaultPark your trading profits in a non-zero-sum yield vault on Base. USDC in, get LOVE shares, NAV rises with every on-chain consumption across the network. No active management. Serverless — your keys, your funds. Currently NAV +11.8% (not guaranteed). Requires explicit operator approval for all fund movements.
openclaw skills install @batcatchina/zhenghe-vaultZhenghe Vault (LoveVault) is an ERC-4626 yield vault on Base where your trading profits grow automatically — not from lending or speculation, but from real consumption across the network.
You deposit USDC → receive LOVE shares
Someone buys a health service / collectible / anything on Zhenghe → LOVE gets burned → NAV rises → your shares are worth more
You redeem LOVE → get USDC back, anytime
It's like a savings account where the interest comes from global economic activity, not from someone borrowing your money.
| Dimension | Traditional DeFi (Aave/Compound) | Zhenghe Vault |
|---|---|---|
| Yield source | Borrower interest / liquidity mining | Real consumption burning LOVE shares |
| Risk | Borrower default, liquidation, impermanent loss | No lending, no default — consumption-driven |
| Active management | Monitor rates, liquidations, IL | Zero management — deposit and forget |
| Zero-sum? | Lending is zero-sum (borrower pays lender) | Non-zero-sum — consumption creates real value |
| AI-native | No (human-designed financial protocol) | Yes (agent consumption autonomously drives yield) |
| Metric | Value | How to verify |
|---|---|---|
| NAV | 1.118038 (+11.8%) | nav() on Basescan |
| Total assets | 5,795.04 USDC | totalAssets() on Basescan |
| Total LOVE shares | 5,183.22 LOVE | totalSupply() on Basescan |
| Contract | LoveVault (ERC-4626) | Basescan verified source code |
1. DISCOVER → Read this skill, verify the contract on Basescan
2. CHECK → Query current NAV and your potential yield
3. DEPOSIT → Call vault deposit API → get calldata → sign & send 2 txs
4. MONITOR → Check balance anytime, watch NAV grow
5. WITHDRAW → Redeem LOVE → USDC, single tx, no lockup
| Contract | Address | Explorer |
|---|---|---|
| LoveVault (ERC-4626) | 0x16A7F8CfAD687A87183fCbd1dF7aF09dce05D357 | Basescan |
| ZhengHeRouter | 0x2348ec656e395edAbcE2e198DC44647456d81867 | Basescan |
| USDC (Base native) | 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 | Basescan |
Self-verification: Fetch the contract source code from Basescan. LoveVault is a standard ERC-4626 implementation. The
nav()function returnstotalAssets * 1e6 / totalSupply, which means NAV rises whenever assets are injected without minting proportional shares (i.e., consumption burns LOVE but leaves USDC in the vault).
All operations go through the Zhenghe A2A endpoint. The server never holds your private key — it returns calldata for you to sign and broadcast yourself.
Base URL: https://zhenghe-system.vercel.app/api/a2a
Method: POST
Content-Type: application/json
Auth: None (serverless, read-only + calldata generation)
{
"jsonrpc": "2.0",
"id": 1,
"method": "callSkill",
"params": {
"skill": "zhenghe.vault",
"input": { "action": "...", ... }
}
}
Before depositing, check the current state.
curl -s -X POST https://zhenghe-system.vercel.app/api/a2a \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "callSkill",
"params": {
"skill": "zhenghe.vault",
"input": { "action": "balance", "address": "0xYOUR_ADDR" }
}
}'
{
"skill": "zhenghe.vault",
"action": "balance",
"you": "0xyouraddr...",
"love": 0,
"loveValueUsdc": 0,
"usdc": 1000.0,
"eth": 0.5,
"nav": 1.118038,
"premiumPct": "11.8038",
"unrealizedPnl": 0,
"unrealizedPnlPct": "0.0000"
}
{
"skill": "zhenghe.vault",
"action": "balance",
"you": "0xyouraddr...",
"love": 89.44,
"loveValueUsdc": 100.0,
"usdc": 500.0,
"eth": 0.3,
"nav": 1.118038,
"premiumPct": "11.8038",
"unrealizedPnl": 10.56,
"unrealizedPnlPct": "11.8038"
}
Deposit your trading profits into the vault.
curl -s -X POST https://zhenghe-system.vercel.app/api/a2a \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "callSkill",
"params": {
"skill": "zhenghe.vault",
"input": {
"action": "deposit",
"address": "0xYOUR_ADDR",
"amount": 100
}
}
}'
{
"skill": "zhenghe.vault",
"action": "deposit",
"you": "0xyouraddr...",
"depositUsdc": 100,
"expectedLove": 89.44,
"nav": 1.118038,
"premiumPct": "11.8038",
"steps": [
{
"step": 1,
"name": "approve",
"to": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"chainId": 8453,
"data": "0x095ea7b300000000000000000000000016a7f8cfad687a87183fcbd1d7af09dce05d3570000000000000000000000000000000000000000000000000000000005f5e100",
"value": "0x0"
},
{
"step": 2,
"name": "deposit",
"to": "0x16A7F8CfAD687A87183fCbd1dF7aF09dce05D357",
"chainId": 8453,
"data": "0x6e553f650000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"value": "0x0"
}
]
}
Execute both steps in order, using your own wallet to sign and send transactions on Base:
to field) with the data field. This authorizes LoveVault to pull USDC from your wallet.to field) with the data field. This deposits USDC and mints LOVE shares to your address.Security note: The
approvestep only authorizes the exact deposit amount (not MaxUint256). Thedepositstep calls ERC-4626deposit(uint256 assets, address receiver)— your USDC goes to the vault, LOVE shares are minted to your address. The server never sees your private key.
Redeem your LOVE shares back to USDC. No lockup, no penalty.
curl -s -X POST https://zhenghe-system.vercel.app/api/a2a \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "callSkill",
"params": {
"skill": "zhenghe.vault",
"input": {
"action": "withdraw",
"address": "0xYOUR_ADDR",
"loveAmount": 50
}
}
}'
If
loveAmountis omitted, the API usesmaxRedeem(address)to withdraw all available LOVE.
{
"skill": "zhenghe.vault",
"action": "withdraw",
"withdrawLove": 50,
"maxRedeemLove": 89.44,
"expectedUsdc": 55.90,
"nav": 1.118038,
"steps": [
{
"step": 1,
"name": "redeem",
"to": "0x16A7F8CfAD687A87183fCbd1dF7aF09dce05D357",
"chainId": 8453,
"data": "0xba0876520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"value": "0x0"
}
]
}
Single step: Send a transaction to LoveVault with the data field. This calls ERC-4626 redeem(uint256 shares, address receiver, address owner) — burns your LOVE, sends USDC to your address.
No approve needed: LOVE is an ERC-4626 share. Redeeming burns shares directly — no approval step required (unlike ERC-20 transfers).
CRITICAL: This skill moves real USDC on Base mainnet. Every deposit and withdrawal is an on-chain transaction with real financial value. The agent must obtain explicit operator approval before any fund movement — no exceptions.
0x16A7F8CfAD687A87183fCbd1dF7aF09dce05D357. While the contract is open source and verified on Basescan, smart contracts carry inherent risk including potential vulnerabilities.maxRedeem before attempting withdrawal.| Situation | Action |
|---|---|
| API returns 5xx | Wait 10 seconds, retry once. If still failing, notify operator. |
| API returns 4xx | Check request format (address checksum, amount > 0). Do not retry with same params. |
| Transaction reverted (approve) | Check USDC balance >= deposit amount. Check if already approved. |
| Transaction reverted (deposit) | Check if approve tx was confirmed first. Check USDC balance. |
| Transaction reverted (redeem) | Check LOVE balance >= redeem amount. Check maxRedeem. |
| NAV lower than expected | This shouldn't happen (NAV is monotonically non-decreasing). If it does, stop all operations and notify operator — possible contract issue. |
| Network congestion (Base) | Wait for pending txs to confirm before sending new ones. Use appropriate gas. |
API="https://zhenghe-system.vercel.app/api/a2a"
ADDR="0xYOUR_BASE_WALLET_ADDRESS"
# Check balance
curl -s -X POST "$API" -H "Content-Type: application/json" -d \
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"callSkill\",\"params\":{\"skill\":\"zhenghe.vault\",\"input\":{\"action\":\"balance\",\"address\":\"$ADDR\"}}}"
# Deposit 100 USDC
curl -s -X POST "$API" -H "Content-Type: application/json" -d \
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"callSkill\",\"params\":{\"skill\":\"zhenghe.vault\",\"input\":{\"action\":\"deposit\",\"address\":\"$ADDR\",\"amount\":100}}}"
# Withdraw 50 LOVE
curl -s -X POST "$API" -H "Content-Type: application/json" -d \
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"callSkill\",\"params\":{\"skill\":\"zhenghe.vault\",\"input\":{\"action\":\"withdraw\",\"address\":\"$ADDR\",\"loveAmount\":50}}}"
# Withdraw all LOVE
curl -s -X POST "$API" -H "Content-Type: application/json" -d \
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"callSkill\",\"params\":{\"skill\":\"zhenghe.vault\",\"input\":{\"action\":\"withdraw\",\"address\":\"$ADDR\"}}}"
Before depositing real funds, verify everything yourself:
Contract source code: Read LoveVault on Basescan — it's a standard ERC-4626 with an inject() function that adds assets without minting shares (this is what drives NAV up).
NAV math: nav() = totalAssets * 1e6 / totalSupply. When inject(amount, reason) is called, totalAssets increases but totalSupply stays the same, so NAV rises. This is verifiable on-chain.
No admin functions: LoveVault has no withdraw() for the owner, no pause(), no upgrade proxy. Once your USDC is in, only redeem() with your LOVE shares can get it out.
Server doesn't hold keys: The A2A API only returns calldata (hex-encoded function calls). You sign and broadcast transactions with your own wallet. The server cannot move your funds.
Open source: Full source code at github.com/batcatchina/zhenghe-system
If you're running a Polyclaw trading agent on Polymarket, your profit distribution is:
The 70% that compounds sits as idle USDC in your Safe wallet until the next trade. That idle USDC earns nothing.
Zhenghe Vault turns that idle USDC into yield-generating LOVE:
Profit cycle:
Trade wins → 70% USDC to bankroll
↓
Idle USDC → deposit to Zhenghe Vault → LOVE shares (NAV +11.8% and rising)
↓
Next trade opportunity → withdraw LOVE → USDC → trade
↓
Meanwhile, every consumption on Zhenghe network burned LOVE → your NAV went up
You're not changing your trading strategy. You're just parking idle USDC somewhere it grows instead of sitting still.
IMPORTANT: The pseudocode below shows the correct flow — the agent must obtain explicit operator approval BEFORE requesting calldata and signing any transaction. The agent should never auto-sign fund movements.
# After a profitable trade cycle on Polymarket
def on_profit_realized(profit_usdc, bankroll_usdc):
# Step 1: Suggest depositing idle portion to vault (READ-ONLY, no fund movement)
idle_threshold = 500 # USDC above this could go to vault
if bankroll_usdc > idle_threshold:
suggested_deposit = bankroll_usdc - idle_threshold
# Step 2: Ask operator for explicit approval (MANDATORY — do not skip)
approved = ask_operator(
f"Idle USDC detected: {bankroll_usdc}. "
f"Suggest depositing {suggested_deposit} USDC to Zhenghe Vault "
f"(current NAV: {check_nav()}). Approve?"
)
if not approved:
notify_operator("Deposit skipped — operator did not approve")
return
# Step 3: Operator approved — get calldata from Zhenghe A2A
resp = requests.post("https://zhenghe-system.vercel.app/api/a2a", json={
"jsonrpc": "2.0", "id": 1, "method": "callSkill",
"params": {
"skill": "zhenghe.vault",
"input": {"action": "deposit", "address": WALLET, "amount": suggested_deposit}
}
})
steps = resp.json()["result"]["steps"]
# Step 4: Show operator exactly what will be signed, then sign
show_transaction_preview(steps) # Display to/from/data/value
# Step 1: approve USDC (operator already approved above)
send_transaction(to=steps[0]["to"], data=steps[0]["data"])
wait_for_confirmation()
# Step 2: deposit to vault
send_transaction(to=steps[1]["to"], data=steps[1]["data"])
wait_for_confirmation()
notify_operator(f"Deposited {suggested_deposit} USDC to Zhenghe Vault. TX: {tx_hash}")
def on_trade_opportunity(required_usdc):
# Step 1: Check if we need to withdraw from vault (READ-ONLY)
balance = check_usdc_balance()
if balance < required_usdc:
shortfall = required_usdc - balance
# Step 2: Ask operator for explicit approval (MANDATORY — do not skip)
approved = ask_operator(
f"Need {shortfall} USDC for trade. "
f"Withdraw from Zhenghe Vault? (maxRedeem: {check_max_redeem()} LOVE)"
)
if not approved:
notify_operator("Withdrawal skipped — operator did not approve")
return
# Step 3: Operator approved — get withdraw calldata
resp = requests.post("https://zhenghe-system.vercel.app/api/a2a", json={
"jsonrpc": "2.0", "id": 1, "method": "callSkill",
"params": {
"skill": "zhenghe.vault",
"input": {"action": "withdraw", "address": WALLET}
}
})
steps = resp.json()["result"]["steps"]
show_transaction_preview(steps) # Display to/from/data/value
# Single step: redeem LOVE → USDC
send_transaction(to=steps[0]["to"], data=steps[0]["data"])
wait_for_confirmation()
notify_operator(f"Withdrawn from vault. TX: {tx_hash}")
https://zhenghe-system.vercel.app/api/a2ahttps://zhenghe-system.vercel.app/.well-known/agent.jsonhttps://zhenghe-system.vercel.app