Bot Titles
BSC-VENUS-LIQ-V1Performance So Far
BSC-VENUS-LIQ-V114-Day Profitability Sprint · Next 3 Moves
BSC-VENUS-LIQ-V1- 01Tighten SIGNAL_MAX_AGE_MS from 15s to 3-5s and add an executor-side projHF probe under ±1% oracle stress before submitting.WhyOn 2026-05-14 the forecaster fired 3 urgent signals at 08:33:40 (curHF 0.327-0.790, biggest cover $3,957). All 3 were skipped 3 seconds later when the executor saw shortfall=0 on chain. The freshness gap is the dominant block: forecaster's cached snapshot can be 5-15s old; in 3-5s the HF crosses back. A single missed $3,957 fire pays for a year of bot operation. We are NOT in opportunity drought — we are in race-to-the-block.Success criterionBy 2026-06-04: at least 1 successful fire OR a documented SKIP-because-shortfall-zero rate drop from 100% to under 30% on tracked watchlist crossings (proving the freshness gap closed).Effort~4 hours (config + executor-side fresh-projHF helper + 48h observation).
- 02DONE 2026-05-25 — vBNB-debt branch shipped via FlashLiquidatorV3 (0xBFa879E0…E720) + BSC_VENUS_VBNB_ENABLED=1. BNB-denominated borrows now route to executeVenusVBnbDebtLiquidation instead of short-circuiting.WhyRoughly 20% of Venus borrowers have BNB-denominated debt. The contract's liquidateBorrow path uses transferFrom; vBNB.liquidateBorrow is payable + receives native BNB. We need a separate code branch that calls liquidateBorrow{value: debtToCover}(). Without it, 1 in 5 underwater borrowers is invisible to us — even if the freshness fix (move #1) lands, we still skip 20% of opportunities.Success criterionBy 2026-06-01: contract upgrade deployed, at least 1 vBNB-debt borrower in the active watchlist enters the executor candidate set (whether they cross or not is market-state-gated).Effort1-2 days (Solidity branch + redeploy + executor dispatch byte).
- 03Mempool-watch BSC Chainlink price-feed updateAnswer transactions. Subscribe to oracle aggregator addresses via WSS, project HF impact at the new price, fire IN the SAME block as the price-update tx.WhyThis converts the bot from "react to already-landed price changes" (every other liquidator does this) to "race-the-oracle pre-emptive liquidator." Every Aave mainnet team does this; BSC Venus has thinner competition + 48 Club bundle relay. Without same-block oracle racing, even with perfect freshness (move #1) we are still one of N bots seeing the post-confirmed price; the gas auction is the only differentiator. With this, we land before the auction starts.Success criterionBy 2026-06-04: WSS subscription to ≥3 Chainlink aggregator addresses live, project-HF helper produces a "would liquidate at new price" log line whenever a relevant price-update tx hits mempool, and 1+ successful same-block fire OR documented latency edge ≤ 200ms vs price-update inclusion.Effort3-5 days (port pulse-sentinel devp2p architecture to BSC + Chainlink ABI integration).
Future Performance Expectations · 7d / 30d / 90d
BSC-VENUS-LIQ-V1| Window | Net USD | Fires | Tier / state | Shape · what has to happen |
|---|---|---|---|---|
| 7d | $0 – $80 | 0–2 | Code-only optimizations live | First fire likely happens IF an underwater BSC user crosses Venus oracle threshold AND survives Comptroller pre-flight. Without V3 deploy + activation, vBNB-debt borrowers still skip (cleanly). Expected 0-2 fires per week 1; per-fire $5-50 net depending on cover size and discount. |
| 30d | $50 – $500 | 5–15 | V3 vBNB-debt active | FlashLiquidatorV3 deployed and BSC_VENUS_VBNB_ENABLED=1. Combined vBep20 + vBNB coverage at 100% of Venus Core Pool borrowers. 5-15 fires/month at current Venus volume + competitor density. Per-fire net $5-50 typical. STRESS_OVERRIDE fires that win indicate we beat the standard 50-bot pack to a price-update — every such event is a moat datapoint. |
| 90d | $300 – $3,000 | 30–100 | Chainlink mempool watching live | Move 3 ships: WSS to ≥3 Chainlink aggregator addresses, project-HF helper, same-block-as-oracle-update firing. This is the structural differentiator — turns the bot from "one of 50 bots racing post-confirmation" to "1-2 bots racing IN-block with the price update." 48 Club private bundle relayer integration accelerates further. At this state the bot has a real moat; expected $10-30 per fire average. |
Recent Fire Attempts
BSC-VENUS-LIQ-V1Token Reverters (24h)
BSC-VENUS-LIQ-V1Biggest Block
BSC-VENUS-LIQ-V1Fleet status 2026-05-21: RUNNING · HEARTBEATING + PRECHECK GATE LIVE. (Re-verified live 2026-05-25.) Today (2026-05-20): added Comptroller.liquidateBorrowAllowed pre-flight in bsc-venus-executor.js (~line 441-484) — surfaces Venus's structured error codes (3=INSUFFICIENT_SHORTFALL, 5=INVALID_ACCOUNT_PAIR, 6=INVALID_CLOSE_AMOUNT, 10=MARKET_NOT_LISTED, etc.) instead of the contract's generic "venus liquidate failed" wrapper. Code 6 (close-factor breach) auto-halves debtToCover and re-probes. Yesterday: dp_249 bridge wired — bsc/lib/dp249-forecast-consumer.js maintains in-memory watchlist (currentHF AND projectedHF < 0.99) and the executor cycle() polls comptroller.getAccountLiquidity every 2s. Bounded-loss: 0.02 BNB/6h auto-disable sentinel.
Status today: 0 PRECHECK events fired since deploy — no watchlist user has crossed shortfall>0 yet. Forecaster sees urgency-signals every 2s (HF 0.50-1.01 cluster) but Venus's on-chain books say HF>=1.0 + liquidity>0 for all of them. New code path is dormant pending a real crossing.
Earlier ship (2026-05-14): refreshVenusMarketsFromChain landed — 6/20 markets had stale collateralFactor (vUSDT 0.770→0.800, vUSDC 0.770→0.825, vETH 0.750→0.800, vBTCB 0.750→0.800, vCAKE 0.550→0.500, vXRP 0.500→0.650). Off-chain HF math aligned with Venus on-chain. Watchlist widened MAX_USERS_PER_CYCLE 30 → 250 the same day.
Historical context (block pattern that motivated dp_249): forecaster↔executor freshness mismatch.
Three urgent signals from the forecaster at 08:33:40, all skipped by the executor at 08:33:43-44 (3 seconds later):
[SIGNAL] urgent | 0xa59ec0ae… curHF=0.482 projHF=0.458 debt=vUSDT coll=vXRP cover=$3957
[SIGNAL] urgent | 0x65fcd151… curHF=0.327 projHF=0.310 debt=vETH coll=vBNB cover=$487
[SIGNAL] urgent | 0x9bc7a167… curHF=0.790 cover=$458
↓ 3 seconds later
[SKIP] 0xa59ec0ae… — on-chain shortfall=0 (Venus says HF>=1.0, liquidity=$400)
[SKIP] 0x65fcd151… — on-chain shortfall=0 (Venus says HF>=1.0, liquidity=$417)
[SKIP] 0x9bc7a167… — on-chain shortfall=0 (Venus says HF>=1.0, liquidity=$375)
Forecaster reads cached snapshot (~5-15s old per SIGNAL_MAX_AGE_MS) → executor does fresh Comptroller.getAccountLiquidity → HF has moved across the 1.0 threshold in the 3-second gap. The forecaster's HF=0.482 was real at capture-time; by execution time the borrower has either added collateral or a Chainlink price update moved oracle marks. The biggest skipped fire today carried $3,957 cover — single liquidation discount easily covers a week of bot operating cost. M1's "SKIP because revenue floor too low" verdict (11 cycles standing) is contradicted by the live data.
Two fixes shape the work:
• Tighten SIGNAL_MAX_AGE_MS from 15s → 3-5s so the freshness gap can't open this wide.
• Have the executor do its own one-line projHF probe under ±1% oracle stress before submitting; if projHF survives stress AND on-chain HF<1.0, fire even if "current" reads marginal.
Earlier blocks cleared 2026-05-14: batchSnapshotUsers (50× cycle speedup), factory.getPair()-resolved swap surface (5× viable routes). The watchlist-sort bug from this entry's prior version is now incidental — the dominant gap today is the freshness window.
Fantasy
BSC-VENUS-LIQ-V1If we had a mempool subscription to the Chainlink price-feed Oracle update transactions on BSC (the same way pulse-sentinel subs to PulseChain mempool), we'd know the next Venus oracle price BEFORE it landed on-chain — and could fire the liquidation tx in the SAME block as the price-update tx itself. Every other liquidation bot reacts to the price change after it's mined; we'd be racing them on inclusion of the very tx that creates the opportunity. This is the standard MEV-extraction pattern on Aave mainnet, but BSC's 48 Club private builder + Venus's smaller bot population means the moat is shallower. Closest real-world thing accessible to us: pulse-sentinel's devp2p peer architecture would port directly to BSC if we ran it against bsc.publicnode.com WSS and the 48 Club RPC. A few days of work to plumb but converts the bot from a passive forecaster-of-already-liquidatable-positions into a pre-emptive race-the-oracle-tx liquidator.
Suggestions for Improvement
BSC-VENUS-LIQ-V1Conclusion
BSC-VENUS-LIQ-V1Verdict: most engineered effort of the fleet, still 0 fires. Trevor-flagship since 2026-05-12 with two of three planned big-block fixes shipped. Both were real wins: Multicall3 batching took cycle time from 20-70s to ~1s, and the WBNB-pivot swap path took addressable Venus pair coverage from 2/9 to 9/9. The pipeline is now mechanically capable of liquidating real users in real time.
Failure mode #1 — opportunity dryness, not infrastructure. Watchlist-sort + Multicall3 batching + dust-skip + dp_249 bridge + Comptroller pre-flight all shipped. Forecaster signals fire every 2s on watchlist users at HF 0.50-1.01, but Venus's own books read HF>=1.0 + liquidity>0 every time. Either the off-chain HF model still drifts vs Venus's oracle, OR there genuinely isn't an underwater BSC Venus user right now. We won't know which until the next price-shock event.
Failure mode #2 — resolved 2026-05-20. Old FlashLiquidator wrapped Venus calls in require(ok, "venus liquidate failed"), discarding the comptroller code. FlashLiquidatorV2 at 0xe83445…193e now revert-bubbles via custom errors VenusLiquidateFailed(uint256) + VenusRedeemFailed(uint256), and bsc-venus-executor.js step-0 decodes them against the existing VENUS_ERROR_CODES table. Post-mining reverts are no longer opaque.
Failure mode #3 — vBNB-debt branch: SHIPPED 2026-05-25. Roughly 20% of Venus borrowers have BNB-denominated debt that the day-1 build short-circuited (vBNB.liquidateBorrow is payable). FlashLiquidatorV3 (0xBFa879E0…E720) added the payable vBNB path; deployed + BSC_VENUS_VBNB_ENABLED=1, so vBNB-debt borrowers now enter the candidate set — ~1.25× addressable pool. First live vBNB fire is the remaining validation.
Fixable? The path is concrete. The bot is the most-engineered-for-readiness in the fleet. First-fire is gated by market state. If a real underwater user appears and we still skip with on-chain shortfall=0, the off-chain HF model needs another reconciliation pass (the 2026-05-14 collateralFactor refresh was step 1; step 2 may be liquidationThreshold or price-mark drift).
Active Tests & Monitors
BSC-VENUS-LIQ-V1| Test / Monitor | Started | Key Metric | Decision Criteria |
|---|---|---|---|
| PRECHECK gate fire-through rate (NEW) | 2026-05-20 | [PRECHECK] count in bsc-venus-executor.log | Comptroller.liquidateBorrowAllowed pre-flight + code-6 close-factor auto-halve is wired. 0 PRECHECK events fired since deploy — no signal has passed shortfall>0 to reach the gate. Will surface real Venus error codes once a crossing happens. |
| Forecaster cycle time | 2026-05-14 (post Multicall3) | [SLOW] cycle=Xms in bsc-venus-forecaster.log | ✅ COMPLETE — Shipped 2026-05-14 (batchSnapshotUsers in lib/venus-forecast, sub-second cycles, [STALE] cascade resolved). Closed 2026-05-27. |
| Signal volume | 2026-04-30 | Signal append rate in bsc-venus-signals.ndjson | Healthy. 7,840 lifetime signals; latest 2026-05-20T17:14:49Z. Forecaster emits urgency:soon every 2s on the dp_249 watchlist (8-10 accounts). |
| Sim-revert capture | 2026-04-24 | bsc-venus-sim-reverts.ndjson append rate | Active. 37,846 lines lifetime; big cluster 2026-05-16. Pre-PRECHECK reverts all carry the generic "venus liquidate failed" wrapper — PRECHECK now produces named Venus codes upstream of this log. |
| Borrower index growth | 2026-04-15 (deploy) | [STATS] index=X in watchlist log | ✅ EFFECTIVELY PRUNED 2026-05-27 — index now 939 total, but watchlist filters to 315 (~33%) via liquidityBufferUsd:500. The "drop ~70%" intent is already implemented at the watchlist layer; scanner only deeply monitors the active 315. Explicit index prune would save ~150KB storage but not scan efficiency. Skip the build. |
| Real liquidatable surface | 2026-04-15 | [STATS] liquidatable=X in watchlist log | CURRENT: 1 across 823 indexed. The opportunity exists but is thin — strategy must tolerate days between fires. Tier-S classification (FR-018) assumes more density than the data shows. |
| Trade outcomes (0 fires lifetime) | 2026-04-15 | bsc-venus-trades.ndjson + bsc-venus-executor.log [FIRE] count | 0 fires ever. Bot has never sent a tx. Every layer below the forecaster is hypothetical until the [STALE] loop clears. |
Compromises
BSC-VENUS-LIQ-V1| Decision | Aggressive ← | Current Position | → Conservative | Notes |
|---|---|---|---|---|
| Forecaster cycle cap (MAX_USERS_PER_CYCLE = 250) | Few · fast cycle, blind to most users | Many · full coverage, stale snapshot | Was 15 → 30 → 250 (2026-05-14, post Multicall3 batching + dust-skip filter). Full watchlist scanned every cycle in <2s. Hidden-liquidatable case (e.g. 0x3af6cd5c HF=0.114) no longer falls outside the window. | |
| HF flag threshold (HF_PREDICT_FLAG = 1.05) | Tight · only flag already-underwater (≤1.0) | Loose · flag every user near 1.2 | Raised 2026-04-23 from 1.0 → 1.05 because 1.0 produced 0 signals (only matched already-liquidatable users, which are racing-frontrun-immediately). 1.05 catches users about to cross under -2% collateral perturbation. Mirror of Base liq pipeline's about_to_pop heuristic. | |
| Swap-pair whitelist (direct V2 only) | Permissive · trust any pool exists | Strict · WBNB + stable-stable only | Day-1 restriction in tryFire (executor:145-152). Excludes the majority of Venus debt/collateral pairs that need WBNB as an intermediate hop. Re-locating to multi-hop or V3 in the FlashLiquidator contract opens 5-10× the addressable opportunity surface. | |
| Min profit floor (MIN_NET_PROFIT_USD = $0.10) | Low · catch dust profits | High · only meaningful trades | Was $1.00, dropped 2026-05-12 per Trevor to encourage fires for end-to-end data while the bot is brand-new. Will revisit if gas costs (~0.001 BNB ≈ $0.30) eat dust fires. Inert until forecaster actually produces signals. | |
| Rate cap (MAX_FIRES_PER_HOUR = 10) | Strict · bounded downside | Uncapped · max opportunity capture | Sliding 1h window. Inert today — bot has 0 lifetime fires. Provides safety bound once pipeline recovers. | |
| Min wallet BNB gas (MIN_BNB_GAS = 0.05) | Loose · run-dry risk | Strict · may starve under spike | 0.05 BNB ≈ $15 ≈ 5-10 fires worth of gas. Pre-flight check before every fire attempt. Wallet 0xEc5Df194 (operator). | |
| Watchlist scan threshold ($500 unused liquidity) | Tight · scan full index every cycle | Loose · only the at-risk subset | LIQUIDITY_BUFFER_USD = 500. Users with unused liquidity > $500 are not in the watchlist. 823 indexed but 250 in watchlist; 30 forecasted per cycle. | |
| Position-size pre-filter (NONE) | Permissive · cycles wasted on dust | Strict · miss small-but-real positions | No min debt/collateral USD floor before forecast.snapshotUser runs. The 0x3af6cd5c $0.10 dust loop ate 829 lifetime cycles. Adding "skip if debtUsd < $50 OR collateralUsd < $50" at snapshotUser entry frees the cycles AND eliminates the inevitable Pancake-quote-fails-on-dust sim revert. | |
| Signal freshness (MAX_SIGNAL_AGE_MS = 15s) | Tight · only block-fresh signals | Loose · burn through stale signals | 15s with BSC ~3s block time spans ~5 blocks. Reasonable today since signals are scarce; tighten to 6-9s once forecaster produces enough volume that we can afford to be picky. | |
| vBNB debt support (NONE) | Permissive · handle payable-native | Strict · skip all vBNB borrowers | tryFire short-circuits if pair.debt.underlying === 'BNB'. The Venus vBNB.liquidateBorrow is payable + receives native BNB rather than transferFrom-ing WBNB, so the contract path differs. Adding a vBNB code branch in FlashLiquidator unlocks the ~20% of Venus borrowers whose debt is in BNB. | |
| Capital deployment (Aave-flash, contract idle) | Conservative · keep contract drained | Aggressive · pre-fund contract for self-flash | Contract holds no balance — every liquidation uses an Aave V3 flash loan + pays 0.05% fee. Could self-finance with a pre-funded pool and skip the flash fee, but then idle capital becomes a target. Current model is correct for the volume profile. |
Parameters
BSC-VENUS-LIQ-V1| Parameter | Value | Reasoning | Potential Adjustment(s) |
|---|---|---|---|
| HF_PREDICT_FLAG | 1.05 (forecaster) | Emit signal if worst-case projected HF crosses below this. Was 1.0 (0 signals), raised 2026-04-23 to catch users about to cross under -2% collateral perturbation. | Raise to 1.10 if signal volume stays thin post-Multicall fix. Drop back to 1.0 if false-alarm rate is the dominant cost. |
| HF_URGENT | 1.0 (forecaster) | Signals below this are tagged urgency:urgent (already liquidatable). Above 1.0 and below 1.05 are tagged urgency:soon. | Tied to HF_PREDICT_FLAG. If we shorten signal_age, can tighten this to 0.99 to add execution headroom. |
| MAX_USERS_PER_CYCLE | 250 (forecaster) | Whole-watchlist scan per cycle. Raised 15 → 30 → 250 (2026-05-14) once Multicall3 batching + cached-dust skip landed. Cycle time now <2s for 250 users. | Keep at 250 unless borrower index grows materially past 1000 (auto-prune would reduce first). |
| FORECAST_INTERVAL_MS | 2000 (forecaster) | Target cycle period. Loop fires every 2s after previous cycle resolves. | Cannot reach today — cycles take 20-70s. Once Multicall ships, true 2s cadence is achievable. |
| MAX_WATCHLIST_AGE_MS | 30000 (forecaster) | Abort cycle if watchlist snapshot is older than this. Prevents acting on stale at-risk data. | Hard-binding. The 30s window matches the worst-case watchlist scan cadence (5s + RPC slack). Raising hides the [STALE] symptom but doesn't fix the underlying cycle-time blowout. |
| SCAN_INTERVAL_MS | 5000 (watchlist) | Comptroller.getAccountLiquidity polling cadence for the at-risk subset. | Tighter (2-3s) if forecaster recovers and we want closer-to-real-time. Looser only if BSC RPC quota becomes a bottleneck. |
| FULL_RESCAN_INTERVAL_MS | 60000 (watchlist) | Full borrower-index sample every minute (capped at 1500 users per cycle). Catches users whose HF drifted slowly out of the hot subset. | No tuning needed today. |
| LIQUIDITY_BUFFER_USD | 500 (watchlist) | Users with unused-liquidity < $500 go in the watchlist hot set. Below this, they're close enough to liquidation to warrant 5s polling. | Raise to $1000 to widen the hot set if forecaster recovers and is hungry for more candidates. |
| MIN_BNB_GAS | 0.05 BNB (executor) | Pre-flight wallet balance check. ~$15 at current BNB price ≈ 5-10 fires of gas headroom. | Raise to 0.10 BNB once bot starts firing consistently and we want a safety buffer. |
| MIN_NET_PROFIT_USD | $0.10 (executor) | Minimum net profit floor passed to FlashLiquidator. Was $1.00, dropped 2026-05-12 per Trevor for end-to-end data collection. | Return to $1.00 after first 5 fires confirm pipeline works. Raise to $5+ once we have data on gas cost per fire. |
| MAX_FIRES_PER_HOUR | 10 (executor) | Sliding 1h window rate cap. Inert today (0 lifetime fires). | Cap can rise to 25-50 once landings prove reliable; or drop to 5 if revert rate is uncontrolled. |
| MAX_SIGNAL_AGE_MS | 15000 (executor) | Reject signals older than 15s at tryFire entry. BSC ~3s blocks → 15s spans 5 blocks. | Tighten to 6-9s once forecaster produces volume. |
| SLIPPAGE_BPS | 200 (executor) | 2% slippage on collateral→debt swap via Pancake V2. Calculated minSwapAmountOut from expectedCollateralSeizedUsd. | Raise to 300-500 on thin pairs that consistently revert with InsufficientOutput. Drop to 100 on stable-stable pairs. |
| AAVE_FLASH_FEE_BPS | 5 (executor) | 0.05% flash-loan fee charged by Aave V3. Subtracted from expected profit at minProfit calculation. | Fixed by Aave — not tunable. Listed for completeness. |
| Swap-pair whitelist | WBNB + stable-stable | hasDirectV2Pool gate in executor:145-152 — only allow swaps where (a) one side is WBNB OR (b) both sides are stables. Day-1 restriction; needs contract upgrade to relax. | Expanding via multi-hop WBNB intermediate in FlashLiquidator opens the majority of Venus debt/collateral pairs. |
| FlashLiquidator contract | 0xd4e0…3790 | Deployed 2026-04-15 by 0xEc5Df194a77839D9A74D2eCa394b28a65C5E1A03. AaveProvider = 0xff75B6da14FfbbfD355Daf7a2731456b3562Ba6D. Owner = operator wallet. | Redeploy needed to add vBNB support OR multi-hop swap path. Single owner key (same as PLS bots). |
Revisions
BSC-VENUS-LIQ-V1| Revision | Summary |
|---|---|
| V1 (launch) | 2026-04-15 — FlashLiquidator deployed on BSC, indexer + watchlist + forecaster + executor wired against Venus Comptroller. 250-user watchlist scan, callStatic sim per candidate, atomic flash-loan repay-and-seize via Aave V3 BSC. |
| V1.1 | 2026-05-12 — HF_PREDICT_FLAG raised 1.0 → 1.05 (catch users about to cross under -2% shock). MAX_USERS_PER_CYCLE 15 → 30. Re-deploy with WBNB-pivot swap path: addressable pair coverage 2/9 → 9/9. |
| V1.2 | 2026-05-14 — Multicall3 batched snapshotUser (cycle time 20-70s → ~1s for 30 users). MAX_USERS_PER_CYCLE 30 → 250 (whole watchlist). Cached-dust skip filter shipped: warm cycles drop to ~1ms. |
| V1.3 | 2026-05-19 — refreshVenusMarketsFromChain landed. 6/20 markets had stale collateralFactor (vUSDT 0.770→0.800, vUSDC 0.770→0.825, vETH 0.750→0.800, vBTCB 0.750→0.800, vCAKE 0.550→0.500, vXRP 0.500→0.650). Off-chain HF math now aligned with Venus on-chain. |
| V1.4 | 2026-05-19 — dp_249 forecaster-executor bridge wired (bsc/lib/dp249-forecast-consumer.js). In-memory watchlist of accounts with currentHF AND projectedHF < 0.99; executor cycle() polls comptroller.getAccountLiquidity every 2s, catching shortfall>0 within 2s instead of waiting on the next forecaster signal. Bounded-loss 0.02 BNB/6h auto-disable sentinel. |
| V1.5 | 2026-05-20 — Comptroller.liquidateBorrowAllowed pre-flight added in bsc-venus-executor.js (~line 441). Surfaces Venus structured error codes (3=INSUFFICIENT_SHORTFALL, 5=INVALID_ACCOUNT_PAIR, 6=INVALID_CLOSE_AMOUNT, 10=MARKET_NOT_LISTED) instead of generic "venus liquidate failed" wrapper. Code 6 (close-factor breach) auto-halves debtToCover and re-probes once. 0 PRECHECK events fired since deploy — no watchlist user has crossed shortfall>0 yet. |
| V2 (CURRENT) current | 2026-05-21 contract redeploy: FlashLiquidatorV2 on BSC at 0xe83445408a95A8721288E3ab311761B3F5ff193e (tx 0xed046b06…5e5fc0f6, replaces V1 at 0xF835799C…231C49). Adds custom errors VenusLiquidateFailed(uint256) (selector 0xe9965fc8) + VenusRedeemFailed(uint256) (selector 0x4d32aac3) that surface the uint Compound V2 error code returned by vToken.liquidateBorrow()/redeem(). Previously the contract did `require(liqErr == 0, "venus liquidate failed")` and discarded the actual error code; now reverts with the code embedded. bsc-venus-executor.js restarted at 20:47:09Z; bot picks up V2 address from flash-liquidator-bsc-address.json with zero code change. |