Conversation
Add monitoring for yvUSD vault covering: - APY inversion detection (unlocked > locked for extended periods) - Negative strategy APR alerts - CCTP cross-chain strategy staleness detection - Flashloan liquidity checks for Morpho looper unwinding - Large LockedyvUSD cooldown request detection Closes #193 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move yvusd monitoring into yearn/ to match project conventions: - yearn/yvusd.py (was yvusd/main.py) - yearn/abi/ for contract ABIs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
| loopers = [ | ||
| s | ||
| for s in strategies | ||
| if s.get("meta", {}).get("type") in LOOPER_STRATEGY_TYPES |
There was a problem hiding this comment.
Current live API data puts the only non-zero looper exposure behind a top-level cross-chain strategy whose remote_vault_type == "morpho-looper" and whose market id lives in remote_meta.market_id. This filter returns zero strategies today, so the monitor logs No active Morpho looper strategies found while the vault still has >$100M of remote looper debt. If the goal is to cover yvUSD unwinding risk end-to-end, we probably need to include the cross-chain case here.
| logger.info("Scanning blocks %d to %d for cooldown events", from_block, current_block) | ||
|
|
||
| try: | ||
| events = locked.events.CooldownStarted.get_logs(fromBlock=from_block, toBlock=current_block) |
There was a problem hiding this comment.
With web3==7.x this call expects from_block / to_block, not camelCase kwargs. As written it raises TypeError (unexpected keyword argument fromBlock) and returns early, so the cooldown monitor never scans any events in production.
| remote_counterpart | ||
| ).call() | ||
| except Exception as e: | ||
| logger.warning("Could not fetch remote counterpart state for %s: %s", name, e) |
There was a problem hiding this comment.
I tried this against the current API metadata and both Arbitrum remote vaults (0x78b7… and 0xBCf0…) revert on strategies(remote_counterpart). Because we only log and continue, the CCTP health check quietly disables itself for those strategies. Can we either use the call/ABI that matches these remote vaults or surface an actual alert when the remote lookup fails?
… kwargs - Remote cross-chain "vaults" (0x78b7…, 0xBCf0…) are V3 tokenized strategies and revert on strategies(); switch to direct lastReport() / totalAssets() calls and surface a MEDIUM alert on lookup failure instead of silently disabling the CCTP health check. - Flashloan liquidity check now picks up cross-chain wrappers whose remote_vault_type is a looper (borrower = remote_vault on the remote chain) and runs per-chain via LOOPER_CHAIN_CONFIG (mainnet + Arbitrum). - events.CooldownStarted.get_logs now uses snake_case from_block / to_block for web3 7.x; camelCase raised TypeError and silently returned. - Add morpho/abi/morpho_blue.json — the previous shared-abi refactor pointed ABI_MORPHO at the MetaMorpho vault ABI, which lacks market()/position() and would have raised ABIFunctionNotFound. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Summary
lastReporttimestamps, alerts if stale (>48h)CooldownStartedevents on LockedyvUSD, alerts on >$100K requestsStrategy discovery
Looper and cross-chain strategies are discovered dynamically from the yvUSD APR API, so no hardcoded strategy list to maintain.
Contract ABIs
Minimal ABIs for:
strategies(),totalAssets())market(),position())CooldownStartedevent,getCooldownStatus(),totalSupply())lastReport(),totalAssets()— used for remote-side CCTP health checks)Test plan
yvusd-api.yearn.fi/api/aprslastReport()/totalAssets()calls succeed on Arbitrum (0x78b7…,0xBCf0…)get_logssnake-case kwargs work on web3 7.xtest_does_not_advance_cache_when_log_fetch_fails)🤖 Generated with Claude Code