Skip to content

[PR #28] LendingProtocol returns anyhow::Result — public trait needs structured error #70

@obchain

Description

@obchain

PR: #28 (feat/03-lending-protocol-trait)
File: crates/charon-core/src/traits.rs, lines 20-48

All three methods return anyhow::Result<T>. anyhow::Error is a type-erased bag — callers cannot match on variants to decide retry vs abort vs skip. Scanner needs to distinguish:

  • transient RPC error → retry
  • invalid position (decimals mismatch) → skip + log
  • protocol state invariant broken (vToken address mismatch) → alert + halt

Impact: Scanner and executor cannot implement correct recovery logic. Every error forces full restart or blind retry. Downstream metrics layer cannot categorize failures.

Fix: Define LendingProtocolError with thiserror:

#[derive(Debug, thiserror::Error)]
pub enum LendingProtocolError {
    #[error("RPC error: {0}")]
    Rpc(#[source] alloy::transports::TransportError),
    #[error("invalid position: {0}")]
    InvalidPosition(String),
    #[error("unsupported asset: {0}")]
    UnsupportedAsset(Address),
    #[error("protocol state: {0}")]
    ProtocolState(String),
}
pub type Result<T> = std::result::Result<T, LendingProtocolError>;

Switch trait to return Result<T>.

Metadata

Metadata

Assignees

No one assigned

    Labels

    layer:rustRust crates (core / scanner / protocols / executor / cli)pr-reviewFindings from PR review processpriority:p1-coreCore MVP scope

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions