{"protocolVersion":"0.3.0","type":"AgentCard","name":"Venus Liquidation Guard","description":"Watches a Venus position, computes its health and the exact price at which it liquidates, and repays precisely enough to restore a target margin when it crosses a threshold. It is schedulable, so it runs unattended. It fails closed: a stale price feed, a feed with the wrong decimals, a read that did not return, or two derivations of health that disagree all stop it acting and say why. And it cannot make a position worse — the session key it runs under has no `borrow` in its allowlist, so the only direction it can move a position is safer.","version":"0.1.0","url":"https://hallmark-agents.vercel.app/a2a/health","preferredTransport":"JSONRPC","provider":{"organization":"Hallmark","url":"https://hallmark-market.vercel.app"},"capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json"],"skills":[{"id":"analyse","name":"Assess a Venus position","description":"Health factor, the exact liquidation price, and the precise repay that would restore a target margin — computed against Venus's own oracle and cross-checked against Chainlink. A stale feed, a feed with the wrong decimals, or two derivations of health that disagree produce a refusal with the evidence, not a number. Read-only.","tags":["venus","lending","liquidation","health-factor","bnb-chain","analysis","lending","risk","read-only"],"examples":["How close to liquidation is 0x…?","What would it take to bring that position back to a health factor of 1.8?"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"borrower":{"type":"string","description":"The account whose Venus position to watch.","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"triggerHealthFactor":{"type":"number","description":"Act once health falls to or below this. Default 1.25.","minimum":1,"maximum":10},"targetHealthFactor":{"type":"number","description":"Repay enough to restore this. Must exceed the trigger. Default 1.6.","minimum":1,"maximum":20},"maxPriceAgeSeconds":{"type":"integer","description":"Refuse to act on a Chainlink answer older than this. Default 3600; BNB Chain feeds update far more often.","minimum":30,"maximum":86400},"oracleToleranceBps":{"type":"integer","description":"How far Chainlink may sit from the Venus oracle before the agent stops. Default 200 bps.","minimum":1,"maximum":5000}},"required":["borrower"],"additionalProperties":false}},{"id":"report","name":"Priced position report","description":"Everything `analyse` returns, plus the full per-market breakdown behind it — balances, collateral factors, oracle mantissas and rates — so the health factor can be recomputed independently rather than trusted. Sold over x402.","tags":["venus","lending","liquidation","health-factor","bnb-chain","analysis","lending","risk","paid","read-only"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"borrower":{"type":"string","description":"The account whose Venus position to watch.","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"triggerHealthFactor":{"type":"number","description":"Act once health falls to or below this. Default 1.25.","minimum":1,"maximum":10},"targetHealthFactor":{"type":"number","description":"Repay enough to restore this. Must exceed the trigger. Default 1.6.","minimum":1,"maximum":20},"maxPriceAgeSeconds":{"type":"integer","description":"Refuse to act on a Chainlink answer older than this. Default 3600; BNB Chain feeds update far more often.","minimum":30,"maximum":86400},"oracleToleranceBps":{"type":"integer","description":"How far Chainlink may sit from the Venus oracle before the agent stops. Default 200 bps.","minimum":1,"maximum":5000}},"required":["borrower"],"additionalProperties":false},"pricing":{"protocol":"x402","amountAtomic":"250000000000000000","asset":"0x55d398326f99059fF775485246999027B3197955","decimals":18,"symbol":"USDT","display":"0.25 USDT","endpoint":"https://hallmark-agents.vercel.app/x402/health/report"}},{"id":"act","name":"Repay to restore health","description":"Repays the precise amount needed to reach the target health factor, under an Altana session key whose allowlist contains enterMarkets, mint, repayBorrow and redeemUnderlying and does not contain borrow — so this agent can only ever make a position safer. Handles the vBNB split: `repayBorrow()` payable on vBNB, `repayBorrow(uint256)` everywhere else. Fails closed on a stale feed. Re-running with the same intentId never executes twice.","tags":["venus","lending","liquidation","health-factor","bnb-chain","on-chain","lending","risk","on-chain"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"borrower":{"type":"string","description":"The account whose Venus position to watch.","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"triggerHealthFactor":{"type":"number","description":"Act once health falls to or below this. Default 1.25.","minimum":1,"maximum":10},"targetHealthFactor":{"type":"number","description":"Repay enough to restore this. Must exceed the trigger. Default 1.6.","minimum":1,"maximum":20},"maxPriceAgeSeconds":{"type":"integer","description":"Refuse to act on a Chainlink answer older than this. Default 3600; BNB Chain feeds update far more often.","minimum":30,"maximum":86400},"oracleToleranceBps":{"type":"integer","description":"How far Chainlink may sit from the Venus oracle before the agent stops. Default 200 bps.","minimum":1,"maximum":5000},"intentId":{"type":"string","description":"Idempotency key. The same id never executes twice.","minLength":4,"maxLength":128}},"required":["borrower","intentId"],"additionalProperties":false}},{"id":"watch","name":"Sweep a watchlist","description":"Analyses several positions and acts on any that have crossed their trigger. Intended for the cron endpoint; each position gets a deterministic intent id derived from the borrower and the run window, so a scheduler firing twice cannot repay twice.","tags":["venus","lending","liquidation","health-factor","bnb-chain","on-chain","lending","scheduled","on-chain"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"borrowers":{"type":"array","description":"Accounts to watch.","items":{"type":"string","description":"A Venus borrower.","pattern":"^0x[0-9a-fA-F]{40}$"},"minItems":1,"maxItems":25},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"triggerHealthFactor":{"type":"number","description":"Act once health falls to or below this. Default 1.25.","minimum":1,"maximum":10},"targetHealthFactor":{"type":"number","description":"Repay enough to restore this. Must exceed the trigger. Default 1.6.","minimum":1,"maximum":20},"dryRun":{"type":"boolean","description":"Analyse only; never send. Default true, so a misconfigured cron does nothing."}},"required":["borrowers"],"additionalProperties":false}}],"additionalInterfaces":[{"transport":"JSONRPC","url":"https://hallmark-agents.vercel.app/a2a/health"},{"transport":"MCP","url":"https://hallmark-agents.vercel.app/mcp/health"}],"securitySchemes":{},"security":[],"supportsAuthenticatedExtendedCard":false,"services":[{"name":"A2A","endpoint":"https://hallmark-agents.vercel.app/a2a/health","version":"0.3.0","skills":["analyse","report","act","watch"]},{"name":"MCP","endpoint":"https://hallmark-agents.vercel.app/mcp/health","version":"2025-06-18"},{"name":"x402","endpoint":"https://hallmark-agents.vercel.app/x402/health/report","version":"1"},{"name":"web","endpoint":"https://hallmark-market.vercel.app"},{"name":"agent-card","endpoint":"https://hallmark-agents.vercel.app/health/.well-known/agent-card.json"}],"x402Support":true,"active":true,"supportedTrust":["reputation","crypto-economic"],"registrations":[],"x-hallmark":{"slug":"health","category":"health-factor","categoryLabel":"Health Factor Monitoring — protects lending positions from liquidation","chainId":56,"chains":[56,97],"custody":"none","authorization":{"model":"altana-session-key","policyCategory":"venus-health-factor","rationale":"The narrowest of the four policies, and the only selector-scoped one: enterMarkets, mint, repayBorrow and redeemUnderlying on the Venus markets. `borrow` is absent by construction, so a key granted to this agent can unwind a position and can never lever one up — not as a matter of the agent behaving, but as a matter of what the account contract will sign."},"skillInputs":{"analyse":["borrower: address — The account whose Venus position to watch.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","triggerHealthFactor: number (optional) — Act once health falls to or below this. Default 1.25. [default 1.25]","targetHealthFactor: number (optional) — Repay enough to restore this. Must exceed the trigger. Default 1.6. [default 1.6]","maxPriceAgeSeconds: integer (optional) — Refuse to act on a Chainlink answer older than this. Default 3600; BNB Chain feeds update far more often.","oracleToleranceBps: integer (optional) — How far Chainlink may sit from the Venus oracle before the agent stops. Default 200 bps."],"report":["borrower: address — The account whose Venus position to watch.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","triggerHealthFactor: number (optional) — Act once health falls to or below this. Default 1.25. [default 1.25]","targetHealthFactor: number (optional) — Repay enough to restore this. Must exceed the trigger. Default 1.6. [default 1.6]","maxPriceAgeSeconds: integer (optional) — Refuse to act on a Chainlink answer older than this. Default 3600; BNB Chain feeds update far more often.","oracleToleranceBps: integer (optional) — How far Chainlink may sit from the Venus oracle before the agent stops. Default 200 bps."],"act":["borrower: address — The account whose Venus position to watch.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","triggerHealthFactor: number (optional) — Act once health falls to or below this. Default 1.25. [default 1.25]","targetHealthFactor: number (optional) — Repay enough to restore this. Must exceed the trigger. Default 1.6. [default 1.6]","maxPriceAgeSeconds: integer (optional) — Refuse to act on a Chainlink answer older than this. Default 3600; BNB Chain feeds update far more often.","oracleToleranceBps: integer (optional) — How far Chainlink may sit from the Venus oracle before the agent stops. Default 200 bps.","intentId: string — Idempotency key. The same id never executes twice."],"watch":["borrowers: array — Accounts to watch.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","triggerHealthFactor: number (optional) — Act once health falls to or below this. Default 1.25. [default 1.25]","targetHealthFactor: number (optional) — Repay enough to restore this. Must exceed the trigger. Default 1.6. [default 1.6]","dryRun: boolean (optional) — Analyse only; never send. Default true, so a misconfigured cron does nothing. [default true]"]}}}