Conversation
Three coupled changes that ship v0.2 of the bot.
1. min_profit_margin_bps replaces the absolute USD floor
The old min_profit_usd_1e6 = $5 floor scaled poorly: loose on small trades,
meaningless on large ones. Replaced with a basis-points margin gate:
gross_swap_output_wei >= total_cost_wei * (10_000 + min_profit_margin_bps) / 10_000
Default 1000 bps (10% margin), validated <= 10_000. Drop reason
BelowMinMargin. Field added to BotConfig with serde default; fork profile
lowers to 100 bps for demo staging.
2. LendingProtocol trait + ProtocolKind factory
Pipeline now holds Arc<dyn LendingProtocol> and never names a concrete
adapter. ProtocolKind enum is #[non_exhaustive] so adding variants is
non-breaking. Factory in charon-protocols/src/lib.rs matches on the kind
and returns a trait object.
VenusAdapter migrated to impl LendingProtocol unchanged behaviourally.
Scanner, executor, profit calc, queue, simulator, submitter, metrics
emitter, and Grafana dashboard are protocol-agnostic.
3. Aave V3 adapter + Ethereum support
AaveV3Adapter implements LendingProtocol against the Aave V3 Pool and
PoolDataProvider. Tolerates Ethereum's 15-field getReserveData tuple via
the same lenient decoder used for BSC's truncated 12-field tuple (PR #421).
CharonLiquidatorAave.sol is the on-chain twin: Aave flashLoanSimple ->
Pool.liquidationCall -> Uniswap V3 exactInputSingle -> repay Aave + 5 bps
premium -> sweep residual to immutable cold wallet.
config/fork-eth.toml ships a complete Ethereum fork profile pinned at
block 20459016 (Aug 5 2024 yen-unwind cascade). deploy/compose/local-stack-eth.yml
runs Prometheus + Grafana on parallel ports (9093 / 3001) so BSC and ETH
stacks can run side-by-side without collision.
Demo numbers reproducible:
cargo run -p charon-cli --release -- --config config/fork-eth.toml \
replay --protocol aave_v3_eth --block 20459016 \
--borrower-file /tmp/seed-eth.txt --hold-secs 600
emits 2 / 4 seeded borrowers, total predicted net profit $14,538.74. The
two silent drops between profit gate and queue (LINK collateral, USDC->WETH
single-hop) are tracked as a follow-up debugging task.
Integration tests aave_v3_connect and aave_v3_fetch exercise the adapter
against a live anvil ETH fork; both pass on the pinned block.
Closes the v0.2 milestone: multi-chain (BSC + ETH), multi-protocol
(Venus + Aave V3), single shared pipeline.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three coupled changes that ship v0.2 of the bot. Tight coupling means they share
config.rsandcli/main.rsedits — splitting them now would be artificial. They are reviewed as one unit but the body below treats each theme separately.1.
min_profit_margin_bpsreplaces the absolute USD floorThe old
min_profit_usd_1e6 = $5floor scaled poorly: loose on small trades, meaningless on large ones. Replaced with a basis-points margin gate:1000bps (10% margin), validated<= 10_000.BelowMinMargin.100bps for demo staging.crates/charon-core/src/profit.rs:315,config.rs:303.2.
LendingProtocoltrait +ProtocolKindfactoryPipeline now holds
Arc<dyn LendingProtocol>and never names a concrete adapter.ProtocolKindenum is#[non_exhaustive]so adding variants is non-breaking. Factory incharon-protocols/src/lib.rsmatches on the kind and returns a trait object.VenusAdaptermigrated toimpl LendingProtocolunchanged behaviourally. Scanner, executor, profit calc, queue, simulator, submitter, metrics emitter, and Grafana dashboard are protocol-agnostic.crates/charon-core/src/traits.rs:59— traitcrates/charon-core/src/config.rs:588—ProtocolKindenumcrates/charon-protocols/src/lib.rs:52— factory3. Aave V3 adapter + Ethereum support
AaveV3AdapterimplementsLendingProtocolagainst the Aave V3 Pool andPoolDataProvider. Reuses the lenientgetReserveDatadecoder (PR #421) so Ethereum's 15-field tuple parses cleanly alongside BSC's truncated 12-field one.CharonLiquidatorAave.solis the on-chain twin:flashLoanSimple→Pool.liquidationCall→ Uniswap V3exactInputSingle→ repay Aave + 5 bps premium → sweep residual to immutable cold wallet.config/fork-eth.toml— Ethereum fork profile pinned at block 20459016 (Aug 5 2024 yen-unwind cascade).deploy/compose/local-stack-eth.yml— Prometheus on127.0.0.1:9093, Grafana on127.0.0.1:3001so BSC and ETH stacks run side-by-side without collision.crates/charon-protocols/tests/aave_v3_{connect,fetch}.rs— integration tests against a live anvil ETH fork; both pass.Demo numbers (reproducible)
FORK_RPC=https://eth.drpc.org FORK_BLOCK=20459016 FORK_CHAIN_ID=1 \ CHARON_SKIP_DEV0_NONCE_RESET=1 ./scripts/anvil_fork.sh # wipe slot, deploy CharonLiquidatorAave (see Notion walkthrough) CHARON_SIGNER_KEY=0xac0974...0ff80 \ CHARON_PRICE_MAX_AGE_SECS=63072000 \ ./target/release/charon --config config/fork-eth.toml replay \ --protocol aave_v3_eth --block 20459016 \ --borrower-file /tmp/seed-eth.txt --hold-secs 600emits 2 / 4 seeded borrowers, total predicted net profit $14,538.74:
0x99E881…5Ddc30x66466…36DE50xe6a5e9…9da40xd8cd65…566bThe two silent drops between profit gate and queue are tracked as a follow-up.
Test plan
cargo build --releasepassescargo test --workspacepassescargo test -p charon-protocols --test aave_v3_connectpasses against ETH fork at 20459016cargo test -p charon-protocols --test aave_v3_fetchpasses against ETH fork at 20459016:3001renders: positions-by-bucket, queue depth, profit cumulative