PR: #33 (feat/08-venus-adapter)
File: crates/charon-protocols/src/venus.rs
Lines: 119-136
Problem: Six fields on VenusAdapter declared pub: comptroller, oracle, markets, close_factor_mantissa, chain_id, underlying_to_vtoken, vtoken_to_underlying. All snapshotted once in connect(), never refreshed. Venus governance can change oracle, closeFactorMantissa, market list via on-chain proposals. New markets added regularly. pub also means any caller can silently overwrite, breaking adapter internal consistency invariant between the two maps.
Impact: Governance vote changing closeFactorMantissa or oracle address → running bot uses stale values until restart. New Venus market listed post-connect never scanned. External mutability invites desync of underlying_to_vtoken and vtoken_to_underlying. close_factor_mantissa used directly in repay-amount computation — stale value produces wrong repay amounts, risking on-chain revert or under-repay.
Fix: Make fields pub(crate) or private, expose read-only accessors where needed. Add refresh() async method re-fetching oracle, closeFactorMantissa, getAllMarkets, rebuilding maps. Call on configurable interval (every N blocks / epoch) from scan loop. Consider watching NewMarket / NewPriceOracle Comptroller events for targeted refreshes.
PR: #33 (feat/08-venus-adapter)
File: crates/charon-protocols/src/venus.rs
Lines: 119-136
Problem: Six fields on
VenusAdapterdeclaredpub:comptroller,oracle,markets,close_factor_mantissa,chain_id,underlying_to_vtoken,vtoken_to_underlying. All snapshotted once inconnect(), never refreshed. Venus governance can changeoracle,closeFactorMantissa, market list via on-chain proposals. New markets added regularly.pubalso means any caller can silently overwrite, breaking adapter internal consistency invariant between the two maps.Impact: Governance vote changing
closeFactorMantissaor oracle address → running bot uses stale values until restart. New Venus market listed post-connect never scanned. External mutability invites desync ofunderlying_to_vtokenandvtoken_to_underlying.close_factor_mantissaused directly in repay-amount computation — stale value produces wrong repay amounts, risking on-chain revert or under-repay.Fix: Make fields
pub(crate)or private, expose read-only accessors where needed. Addrefresh()async method re-fetchingoracle,closeFactorMantissa,getAllMarkets, rebuilding maps. Call on configurable interval (every N blocks / epoch) from scan loop. Consider watchingNewMarket/NewPriceOracleComptroller events for targeted refreshes.